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 :

Cumul avec conditions


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    60
    Points
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 60
    Points : 64
    Par défaut Cumul avec conditions
    salut salut ,


    j'aimerais faire une nouvelle colonne qui compte le nombre de ligne mais en prenant en compte un paramètre exemple :

    j'ai 2700 lignes dans ma table et j'en ai 500 qui m'intéressent dedans car elle ont toutes en commun une valeur ( HD_archive = 0 ) mais je veux pas afficher :
    2700
    2700
    2700
    je voudrais afficher :
    500 
    500
    500
    , à chaque ligne

    j'ai tenté des ... count( hd_archive ) , count ( hd_archive = 0 ) , count(hd_archive)
    ...
    where hd_archive =0

    et ça me donne pas vraiment le bon résultats ...

    merci de m'aider :/

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Points
    5 849
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Par défaut
    Avec CASE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sum(case when hd_archive = 0 then 1 end)
    En même temps si tu filtres sur hd_archive=0 dans le WHERE, un simple count(*) devrait suffir non ?

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    60
    Points
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 60
    Points : 64
    Par défaut
    ok , en fait mon érreur vient d'autre part car j'avais tenté ca aussi et ca me donnait des chiffres ébérant .

    je fais ca sur une jointure et du coup il compte le nombre de lignes de la jointure et pas de la table...

    bon bah c'est fail . j'vais chercher autre chose merci

  4. #4
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Points
    2 520
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Par défaut
    Tu devrais nous mettre tes données et ta requête. Peut-être que nous verrons une erreur qui t'aurais échappée.

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    60
    Points
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 60
    Points : 64
    Par défaut
    j'ai retravaillé un peu le truc et j'ai maintenant besoin de compter le nombre de ligne qui valide une condition. j'ai besoin d'avoir le nombre d'utilisateurs déjà présents en base à la semaine donnée : exemple sur la ligne qui agrège les données de la semaine 26 , je veux le nombre d'utilisateurs connectés sur cette période ( ça OK ) , le nombre d'utilisateurs déjà en base à ce moment . ligne 27 idem ... etc

    le but étant de sortir une agrégation je veux avoir quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    semaine | nb user co |nb user not archived
    26 | 18 | 380
    27 | 33 | 389
    28 | 6  | 393
    j'ai une table "user info" où j'ai la liste des users , leur ID , leur date de création ( c'est sur ce critère que je calcule la 3eme colonne, tout ceux créés avant cette date et qui sont pas archivé ) , si ils sont archivés ou pas . deuxième table "connexion" , qui répertorie la date de connexion et l'ID de l'utilisateur qui s'est connecté.

    ce que j'ai fait c'est de joindre la deuxième table en prenant comme clé l'ID user . la table de gauche est la table info , celle de droite la table des connexions. j’agrège sur les ID parce que le nombre de connexions ne m'intéresse pas , je veux juste le nombre d'utilisateurs. et comme j'ai les dates de chaque connexion j'en déduis facilement le nombre d'utilisateurs connectés en semaine 26, 27 , 28 . mon problème c'est le calcul de la troisième colonne .

    je ne vois pas comment partir . j'ai tenté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count ( Case when DATEPART(week , T1.Date_crea) < t2.semaine then 1 else 0 end
    c'est ce qui me semble le plus proche de ce que je veux mais ça ne marche pas du tout .

    edit : je vois lola que tu bosse dans la BI , eh bien tout le problème vient d'ici pour moi. le but est de faire une seule requête et d'avoir à la fin une vue sur laquelle puisse taper un TCD directement sans rajouter de champ sous Excel .

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 130
    Points
    28 511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 130
    Points : 28 511
    Par défaut
    Il nous manque pas mal d'informations pour pouvoir t'aider :
    • la structure des tables
    • la requête que tu exécutes
    • un jeu d'essai et le résultat attendu

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    60
    Points
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 60
    Points : 64
    Par défaut
    je join un fichier ou je montre le pb. en supprimant tout le reste . mon seul problème au final est de faire un "SOMME.SI" comme sur excel mais en sql.

    la solution est en feuil1 et la table et sa structure en feuil2 . j'ai rajouté 2 colone en feuil2 pour montrer comment je calcul mais c'est pas un soucis pour moi de ne pas passer par cette étape.

    merci a celui qui trouve une solution ^^
    Fichiers attachés Fichiers attachés

  8. #8
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Points
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Points : 1 414
    Par défaut
    je refuse de regarder cela.

    SVP suivez les règles du forum

    je veux bien prendre du temps, mais...

  9. #9
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Points
    5 849
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Par défaut
    Citation Envoyé par hanamachi Voir le message
    je ne vois pas comment partir . j'ai tenté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count ( Case when DATEPART(week , T1.Date_crea) < t2.semaine then 1 else 0 end
    Ce COUNT n'a aucun sens, COUNT compte +1 pour chaque ligne où la colonne est non null. Ici il compte +1 pour 1 et +1 pour 0.

    Mon exemple utilisait SUM, si tu l'avais utilisé le ELSE 0 n'aurais pas été faux (même s'il ne répond peut être pas au besoin, aucune idée sans exemple correctement exposé.)

    Sans le ELSE 0 (donc implicitement avec ELSE NULL) le COUNT a un sens, ci-dessous un exemple pour illuster :
    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
    SQL> select * from t;
     
             C
    ----------
             1
             2
             3
             4
             5
             6
             7
             8
             9
            10
     
    10 rows selected.
     
    SQL> select count(*) as cnt,
           count(case when c <= 5 then 1 else 0 end) as cnt_case_faux,
           count(case when c <= 5 then 1 end) as cnt_case_bon,
           sum(case when c <= 5 then 1 else 0 end) as sum_case_bon1,
           sum(case when c <= 5 then 1 end) as sum_case_bon2
      from t;
     
           CNT CNT_CASE_FAUX CNT_CASE_BON SUM_CASE_BON1 SUM_CASE_BON2
    ---------- ------------- ------------ ------------- -------------
            10            10            5             5             5
     
    SQL>

  10. #10
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    60
    Points
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 60
    Points : 64
    Par défaut
    Citation Envoyé par dehorter olivier Voir le message
    je refuse de regarder cela.

    SVP suivez les règles du forum

    je veux bien prendre du temps, mais...
    merci, commentaire très constructif sachant qu'on vient de me demander de fourinir plus d'infos ... bref ...

    merci , skuatamad pour ces précision sur le case when. j'avais pas compris que le else allait du coup remplacer mon count( ... ) par un count (*)

    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
    Select Tab.semaine , count ( case when DATEPART(week,Tab.USE_DT_CREATION)<=Tab.semaine  then 1 end )
    FROM
    (
    SELECT USE_DT_CREATION , DATEPART(week,USE_DT_CREATION) semaine
    FROM BDROP.dbo.DR_USER_INFORMATION DR_USER_INFORMATION
    WHERE (DR_USER_INFORMATION.HD_DROP_ARCHIVE=0)
     
    ) Tab
     
    group by Tab.semaine
     
     
    results :
    semaine   Nb_user
    -----------------
    23	106
    24	27
    25	24
    27	1
    c'est presque ca mais j'voudrai juste que ca cumul :/ et obtenir ... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    semaine   NB_user
    -------------------
    23	106
    24	133
    25	157
    27	158
    any advises ? ( c'est une base sql server )

  11. #11
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 130
    Points
    28 511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 130
    Points : 28 511
    Par défaut
    Si tu avais posé la bonne question dès le départ, avec les bonnes informations... que de temps gagné !!!!

    Rappel : Règles du forum Langage SQL à lire par tous

  12. #12
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 189
    Points
    7 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 189
    Points : 7 436
    Billets dans le blog
    1
    Par défaut
    Cumul progressif => Requête analytique, avec un truc genre "sum() over partition machin".

    Sinon, ton application est capable de faire ce genre de cumuls, donc autant le faire dans le code client.

  13. #13
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    60
    Points
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 60
    Points : 64
    Par défaut
    je pense avoir trouver ce qu'il me faut, je le post au cas ou ca servirai a quelqu'un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DATEPART(week,USE_DT_CREATION)  , 
    (select count(*) from DR_USER_INFORMATION where DATEPART(week,USE_DT_CREATION)<=DATEPART(week,tab.USE_DT_CREATION) and HD_DROP_ARCHIVE=0)
    FROM BDROP.dbo.DR_USER_INFORMATION tab
    WHERE (tab.HD_DROP_ARCHIVE=0)
    group by DATEPART(week,USE_DT_CREATION)
    ca parait barbar mais en fait non , le "cumul" est dans le select count(*). On recalcul le total du nombre de ligne respectant la condition pour chaque lignes( attention a pas faire ca sur trop de ligne ... )

    merci quand même a ceux qui ont éssayé d'aider mon cas.

    au plaisir

  14. #14
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Points
    18 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Points : 18 395
    Par défaut
    On peut faire un peu plus raffiné. Est-ce du SQL-Server 2005 (ou plus) ?

  15. #15
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    60
    Points
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 60
    Points : 64
    Par défaut
    Citation Envoyé par Waldar Voir le message
    On peut faire un peu plus raffiné. Est-ce du SQL-Server 2005 (ou plus) ?
    version 2008 R2 à priori

    je suis pour une version plus rafiné si tu as des conseils.

  16. #16
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Points
    18 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Points : 18 395
    Par défaut
    Oui, on va commencer par faire de la factorisation de requête à l'aide d'une expression de table commune, puis les utiliser pour faire une jointure, généralement (avec toutes les précautions à appliquer à ce mot) plus efficace qu'une requête scalaire (sous-requête située dans le select).

    Ça donnerait quelque chose de ce type :
    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
    WITH Req (sem_creation, nb) AS
    (
      SELECT DATEPART(week, USE_DT_CREATION), count(*)
        FROM BDROP.dbo.DR_USER_INFORMATION
       WHERE HD_DROP_ARCHIVE = 0
    GROUP BY DATEPART(week,USE_DT_CREATION)
    )
        SELECT R1.sem_creation
             , R1.nb
             , sum(R2.nb) as nb_cumul
          FROM Req as R1
    INNER JOIN Req as R2
            ON R2.sem_creation <= R1.sem_creation -- le sens à vérifier
      GROUP BY R1.sem_creation, R1.nb
      ORDER BY R1.sem_creation ASC;

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

Discussions similaires

  1. Cumul avec conditions
    Par Davidb_ dans le forum QlikView
    Réponses: 15
    Dernier message: 12/06/2014, 11h25
  2. [XL-2003] Faire un cumul avec condition.
    Par probexcel dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/06/2009, 10h52
  3. Problème de requête avec cumul des conditions sur un champ
    Par UtopieAmbiante dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/01/2006, 11h52
  4. Index avec conditions
    Par marhnix dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 29/03/2004, 11h48
  5. boucle avec condition d'arret changeante
    Par NicoH dans le forum Langage
    Réponses: 3
    Dernier message: 10/06/2003, 12h48

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