IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Besoin d'aide pour élaboration de requête


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 8
    Points : 8
    Points
    8
    Par défaut Besoin d'aide pour élaboration de requête
    Bonjour à tous!

    Voilà, je suis en train de développer une application de gestion de stock, et arrivant dans la partie de calculation du stock, j'ai une difficulté à élaborer une requête SQL.

    Base de données: Plusieurs tables dont la table "transactions" contenant les champs suivants:
    id_transaction, fk_medicationDetail, fk_partnerFrom, fk_partnerTo, quantity, realQuantity, dateTransaction, dateModification, status, fk_lot.

    Le principe est le suivant: lorsqu'on crée un mouvement de stock, celui-ci sera enregistré par une transaction d'un partenaire à l'autre. Ceci pour un certain médicament (fk_medicationDetail) et pour un lot particulier (fk_lot).

    Ce que j'aimerais faire, c'est:
    Pour un fk_médicamentDetail, calculer pour chaque partenaire le nombres d'entrée de stock(somme de la quantité pour fk_partnerTo = mon partenaire) et les sorties (somme de la quantite pour fk_partnerFrom = monPartenaire).

    La requête que j'ai écrite fait cette calculation, mais ne gère pas les partenaires. Je suis obligé de faire un for each partenaire dans mon programme et exécuter la requête pour chaque partenaire.

    Voici la requête que j'ai pour le moment:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SQL = "SELECT " & _
                    " (SELECT Sum(quantity) FROM transactions WHERE status=1 AND transactions.fk_partnerTo=" & fk_partner & " AND fk_medicationDetail=" & fk_medicationDetail & ") as incoming," & _
                    " (SELECT Sum(realQuantity) FROM transactions WHERE status=1 AND transactions.fk_partnerTo=" & fk_partner & " AND fk_medicationDetail=" & fk_medicationDetail & ") as Realincoming," & _
                    " SUM(quantity) AS outgoing, (incoming - realIncoming) as missing, (incoming-outgoing) as stock FROM transactions" & _
                    " WHERE transactions.fk_partnerFrom=" & fk_partner & _
                    " AND fk_medicationDetail=" & fk_medicationDetail & _
                    " AND status=1"
    Voici quelques données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    id_transaction	fk_medicationDetail	fk_partnerFrom	fk_partnerTo	quantity	realQuantity	dateTransaction	dateModification	status	fk_lot
    31	20	6	1	1000	1000	01.09.2007		1	14
    32	20	1	7	100	100	01.09.2007		1	14
    34	20	6	1	1000	1000	05.09.2007		1	15
    35	20	6	1	1000	1000	10.09.2007		1	14
    38	20	6	1	11	11	10.09.2007		1	14
    39	20	6	1	10	10	19.09.2007		1	14
    40	20	1	7	100	100	01.08.2007		1	14
    41	20	1	7	111	0	01.08.2007		0	14
    42	20	1	7	100	100	03.08.2007		1	14
    43	20	6	1	1000	1000	10.08.2007		1	14
    44	20	1	10	100	100	10.08.2007		1	14
    45	20	1	1	20	0	21.09.2007		0	14
    46	20	1	7	10	0	21.09.2007		0	20
    47	20	1	10	1111	1111	21.09.2007		1	15
    48	25	6	1	1000	0	21.09.2007		0	0
    49	25	6	1	1111	0	21.09.2007		0	0
    50	25	6	1	200	0	21.09.2007		0	0
    Donc comme je l'ai dit, je fais un for...each pour chaque partenaire et ensuite chaque ligne, je l'ajoute dans ma grille pour affichage.
    Je développe en VB.NET.

    Voilà, j'espère que qqn aura une petite idée pour que je puisse terminer cette partie.

    Merci d'avance à tous!
    Ciao,
    P.

  2. #2
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 63
    Points : 71
    Points
    71
    Par défaut
    Essaye un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    SELECT (SELECT SUM (quantity)
              FROM transactions
             WHERE status = 1
               AND transactions.fk_partnerto = transactions.fk_partnerfrom
               AND fk_medicationdetail = transactions.fk_medicationdetail) AS incoming,
           (SELECT SUM (realquantity)
              FROM transactions
             WHERE status = 1
               AND transactions.fk_partnerto = transactions.fk_partnerfrom
               AND fk_medicationdetail = transactions.fk_medicationdetail) AS realincoming,
           SUM (quantity) AS outgoing, (incoming - realincoming) AS MISSING,
           (incoming - outgoing) AS stock
      FROM transactions
     WHERE transactions.fk_partnerfrom in (select distinct fk_partner from PARTNER)
       AND transactions.fk_medicationdetail = (select distinct fk_medicationdetail from medication)
       AND status = 1
    Mais la j'avoue que je ne sais pas si ca va t'aider

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 882
    Points : 53 073
    Points
    53 073
    Billets dans le blog
    6
    Par défaut
    Votre requête gagnerait à êytre écrite de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    WITH 
     
    incoming AS
    (SELECT SUM (quantity)
     FROM   transactions
     WHERE  STATUS = 1
       AND  transactions.fk_partnerto = transactions.fk_partnerfrom
       AND  fk_medicationdetail = transactions.fk_medicationdetail),
     
    realincoming AS
    (SELECT SUM (realquantity)
     FROM   transactions
     WHERE  STATUS = 1
       AND  transactions.fk_partnerto = transactions.fk_partnerfrom
       AND  fk_medicationdetail = transactions.fk_medicationdetail),
     
    outgoing AS
    (SELECT SUM (quantity) 
     FROM   transactions t
            INNER JOIN  PARTNER P
                  ON t.fk_partnerfrom = P.fk_medicationdetail
            INNER JOIN medication M
                  ON t.fk_medicationdetail = M.fk_medicationdetail
     WHERE  STATUS = 1)
     
    SELECT (incomming) AS incoming, (realincoming) AS realincoming,
           (outgoing) AS outgoing, 
           ((incoming) - (realincoming)) AS MISSING,
           ((incoming) - outgoing) AS stock
    [FROM dual]
    A +

  4. #4
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Bonjour!

    Merci pour vos réponses!!

    En fait après avoir étudié vos solutions j'ai eu l'idée suivante et elle marche.
    Donc problème résolu. Voici la solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT id_partner, partnerName, fk_partnerType,
    (SELECT sum(quantity) FROM transactions WHERE fk_partnerTo = id_partner AND fk_medicationDetail=? AND status=1) as Incoming,
    (SELECT sum(realquantity) FROM transactions WHERE fk_partnerTo = id_partner AND fk_medicationDetail=? AND status=1) as RealIncoming,
    (SELECT sum(realQuantity) FROM transactions WHERE fk_partnerFrom = id_partner AND fk_medicationDetail=? AND status=1) as Outgoing, 
    (Incoming-RealIncoming) as Missing, 
    RealIncoming-Outgoing as Stock
    FROM partners WHERE fk_partnerType <> 1 ORDER BY fk_partnerType, partnerName
    Merci encore pour votre aire et à plus!

    Ciao,
    p.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Besoin d'aide pour une petite requête avec distinct
    Par mims1664 dans le forum Requêtes
    Réponses: 4
    Dernier message: 20/02/2009, 12h58
  2. Besoin d'aide pour créer une requête
    Par fabien59420 dans le forum Requêtes et SQL.
    Réponses: 44
    Dernier message: 26/05/2008, 11h08
  3. [MySQL] besoin d'aide pour exécuter une requête et en récupérer le résultat
    Par fast462 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 28/05/2007, 10h30
  4. besoin d 'aide pour formuler une requête
    Par cdu dans le forum Langage SQL
    Réponses: 2
    Dernier message: 08/04/2006, 19h38
  5. besoin d'aide pour optimiser une requête
    Par jisse dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/01/2006, 09h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo