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

MS SQL Server Discussion :

count intermédiaire récurcif


Sujet :

MS SQL Server

  1. #1
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut count intermédiaire récurcif
    Bonjour,

    je travaille sur des extrations pour alimenter un BI. la société vend par lot, qui est revendu au détail jour par jour

    la table vente a les infos suivantes: num_client,num_produit,quantité, date_du_jour, num_lot
    la table des lots
    num_lot,num_client,num_produit,date_livraison,quantité_produit

    mon problème est de savoir si la société ne fait pas le réassort trop tot?

    comment calculer la somme des ventes d'un produit pour un lot donné pour un jour donné, mais pour tous les clients et lots sans faire de curseur

    pour un client et un lot , une requête du style (mais qui ne fonctionne pas)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select SUM(quantité), num_lot, MIN(date_du_jour )
    from vente
    join lot on ....
    where num_produit=xx
    and num_client=yy
    and date_du_jour > date_de_livraison
    group by num_lot
    having SUM(quantité) > quantité_produit
    merci

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Points : 1 327
    Points
    1 327
    Par défaut
    Bonjour,

    Qui ne fonctionne pas
    C'est à dire ? Le résultat retourné n'est pas le bon ?
    Une erreur est retournée ?
    "Qui ne fonctionne pas" c'est vague ...


    comment calculer la somme des ventes d'un produit pour un lot donné pour un jour donné, mais pour tous les clients et lots sans faire de curseur
    Pour un lot donné ou pour tous les lots ???


    Somme des ventes d'un produit peu importe le lot et le client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT num_produit, sum(quantite)
    FROM vente
    WHERE date_du_jour=MaDateVoulue
    AND num_produit=MonProduitVoulu
    GROUP BY num_produit

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Citation Envoyé par serge0934 Voir le message
    comment calculer la somme des ventes d'un produit pour un lot donné pour un jour donné, mais pour tous les clients et lots sans faire de curseur
    pouvez vous fournir un petit jeu de test avec résultat attendu, ça aiderait a mieux comprendre ce que vous souhaitez...

  4. #4
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    un petit jeu de test

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    CREATE TABLE VENTE
    (num_client int,
    num_produit int,
    quantité int, 
    date_du_jour int, 
    num_lot int
    );
     
    CREATE TABLE LOT
    (num_lot int,
    num_client int ,
    num_produit int,
    date_livraison int,
    quantité_produit int
    );
     
    INSERT INTO LOT (um_lot,num_client,num_produit,date_livraison,quantité_produit)
    VALUES(87,34,658,20121128,900);
    INSERT INTO LOT (um_lot,num_client,num_produit,date_livraison,quantité_produit)
    VALUES(89,34,658,20121206,700);
    INSERT INTO LOT (um_lot,num_client,num_produit,date_livraison,quantité_produit)
    VALUES(91,34,658,20121220,1000);
    INSERT INTO LOT (um_lot,num_client,num_produit,date_livraison,quantité_produit)
    VALUES(102,34,658,20121229,1000);
     
     
    INSERT INTO VENTE (num_client,num_produit,quantité, date_du_jour, num_lot)
    VALUES (34,658,193,20121209,87);
    INSERT INTO VENTE (num_client,num_produit,quantité, date_du_jour, num_lot)
    VALUES (34,658,145,20121210,89);
    INSERT INTO VENTE (num_client,num_produit,quantité, date_du_jour, num_lot)
    VALUES (34,658,125,20121211,89);
    INSERT INTO VENTE (num_client,num_produit,quantité, date_du_jour, num_lot)
    VALUES (34,658,146,20121212,89);
    INSERT INTO VENTE (num_client,num_produit,quantité, date_du_jour, num_lot)
    VALUES (34,658,167,20121213,89);
    INSERT INTO VENTE (num_client,num_produit,quantité, date_du_jour, num_lot)
    VALUES (34,658,112,20121214,89);
    INSERT INTO VENTE (num_client,num_produit,quantité, date_du_jour, num_lot)
    VALUES (34,658,154,20121215,89);
    INSERT INTO VENTE (num_client,num_produit,quantité, date_du_jour, num_lot)
    VALUES (34,658,125,20121216,90);
    INSERT INTO VENTE (num_client,num_produit,quantité, date_du_jour, num_lot)
    VALUES (34,658,156,20121217,90);
    INSERT INTO VENTE (num_client,num_produit,quantité, date_du_jour, num_lot)
    VALUES (34,658,189,20121218,90);
    donc le principe recherché est de déterminer a partir de quand on change de lot; on sait par exemple que l'on est passé du lot 87 au lot 89 le 9 décembre et du 89 au 90 le 16, mais on ne sait pas combien de produit du lot 89 a été vendu le 16

  5. #5
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Points : 1 327
    Points
    1 327
    Par défaut
    et, à partir de ce jeu d'essai, quel est le résultat attendu ?
    Parce que je ne vois toujours pas clairement quel est le soucis.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    je voudrais avoir un résultat qui me dise

    le 10 décembre on a vendu 45 produits du lot 87 et 100 du lot 89
    sachant qu'on ne peut pas avoir 2 lignes dans vente pour la même journée, le lot du premier article vendu est celui qui est renseigné dans vente. A l'insertion de la 1° vente, on mets le lot du produit et après on fait update quantité=quantité+1 sans toucher au lot (c'est pas beau mais c'est comme cela )

    donc pour cela, il me savoir combien de produit du lot 87 j'ai vendu avant le 10 décembre; ensuite je ferais total du lot => 900 - nb_vendu_avant_lot_87 = nb_vendu_le_10_lot_87
    et j'aurai le nombre vendus le 10 pour le lot 89 en faisant
    nb_vendu_le_10_lot_89 = 145 - nb_vendu_le_10_lot_87

    et ainsi de suite...

    je reconnais que c'est un peu tordu

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par serge0934 Voir le message
    donc le principe recherché est de déterminer a partir de quand on change de lot; on sait par exemple que l'on est passé du lot 87 au lot 89 le 9 décembre et du 89 au 90 le 16, mais on ne sait pas combien de produit du lot 89 a été vendu le 16
    dans votre jeu de données, on est passé du lot 89 au 90 le 15 décembre non ???

    La date au type INT, c'est voulu ??? pourquoi ne pas mettre cette colonne en type DATE ?

  8. #8
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    oui, tu as raison aieeeuuuuu....

    a force de chercher et tourner en rond je fatigue;

    La date au type INT, c'est voulu ??? pourquoi ne pas mettre cette colonne en type DATE ?
    oui, car en fait, l'appli est vielle, elle tournait sur NT4 comme OS et SQL6.5 comme version SQL (en 1998)

    a l'époque le champ date n'existait pas
    et il n'y a pas les crédits pour récrire l'appli, on a pu péniblement passer les agences sous SQL2000 et pas plus a cause des drivers de l'appli.
    en revanche, le reporting est sur un SQL2008R2, pour les chefs ya les sous...

  9. #9
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par serge0934 Voir le message
    le 10 décembre on a vendu 45 produits du lot 87 et 100 du lot 89
    Le 10 décembre, vous n'avez vendu que du lot 89 non ????

    pas très clair tout ça.

    Dans votre jeu de données, je pense qu'il manque la totalité des ventes pour le lot 87, sinon nous ne pouvons pas savoir combien ont été vendus le jour où ont est passé au lot 89

  10. #10
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    si l'on prend le pb en globalité:

    on a 12 ans d'archives donc on peut remonter au premier lot de chaque produit; mon pb est le nombre de couple produit/lot; si je fais un curseur, c'est très simple mais ca prend des plombes.

    je voudrais simplement savoir s'il est possible d'obtenir par une requête le résultat de la forme:

    num_produit, num_lot, 1°_jour_de_vente_du_lot, dernier_jour_de_vente_du_lot, nombre_vendu_entre_1°etdernier_jour
    385,89,20121210,20121215,849
    385,90,20121216,null,281

    j'espère que ce sera un peu plus clair

  11. #11
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Etes vous sûr de la cohérence de votre résultat par rapport à votre jeu d'essai ?

    385,90,20121216,null,281
    Vous semblez ne pas prendre en compte les ventes du dernier jour (le 20121218)

    Enfin, par rapport à ce que vous disiez plus haut, j'ai l'impression que le résultat attendu ne tiens pas compte des dernières lignes de chaque lot qui, vous le disiez, inclut les ventes du lot suivant...

    est-ce que cette requete répond à votre besoin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT 
    	num_produit,
    	num_lot,
    	MIN(date_du_jour) AS PremierjourVente,
    	CASE WHEN RANK() OVER(ORDER BY num_lot DESC) = 1 THEN NULL ELSE MAX(date_du_jour) END AS DenierJourVente,
    	SUM(quantité) AS NombreVendus
    FROM	VENTE
    GROUP BY 
    	num_produit,
    	num_lot
    ORDER BY 1,2,3

  12. #12
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    oui c'est possible car le jeu d'essai, je vous l'ai créé a la volée
    j'ai fait les additions de tête, etc...

    par contre ce
    CASE WHEN RANK() OVER(ORDER BY num_lot DESC) = 1 THEN NULL ELSE MAX(date_du_jour) END AS DenierJourVente
    me plait bien, sans savoir ce qu'il veux dire

    je regarde déjà ce que cela veut dire, je teste et vous réponds

    en tout cas merci de votre promptitude...

  13. #13
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Il sert juste a mettre un null en date de fin pour le dernier lot...

  14. #14
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Points : 1 327
    Points
    1 327
    Par défaut
    Citation Envoyé par serge0934 Voir le message
    si l'on prend le pb en globalité:

    on a 12 ans d'archives donc on peut remonter au premier lot de chaque produit; mon pb est le nombre de couple produit/lot; si je fais un curseur, c'est très simple mais ca prend des plombes.

    je voudrais simplement savoir s'il est possible d'obtenir par une requête le résultat de la forme:

    num_produit, num_lot, 1°_jour_de_vente_du_lot, dernier_jour_de_vente_du_lot, nombre_vendu_entre_1°etdernier_jour
    385,89,20121210,20121215,849
    385,90,20121216,null,281

    j'espère que ce sera un peu plus clair
    Là oui, pour moi c'est enfin clair.
    Et la preuve, une solution vous a été donnée aussitôt qui semble parfaitement appropriée

  15. #15
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    tests cocluant,

    merci a vous

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/10/2007, 16h36
  2. limiter le résultat retourné par le count
    Par SuperFoustan dans le forum Langage SQL
    Réponses: 8
    Dernier message: 05/08/2003, 12h10
  3. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02
  4. Multiple Count
    Par Antichoc dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/03/2003, 11h19
  5. Compter le nombre ligne listée (COUNT) ?
    Par StouffR dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/09/2002, 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