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

DB2 Discussion :

COUNT AS .. donne quel type d objet


Sujet :

DB2

  1. #1
    Candidat au Club
    COUNT AS .. donne quel type d objet
    Bonjour,

    Excusez moi pour la présentation. Je cherche à additionner et à afficher la valeur des nombres d'une "colonne" (? c'est quoi en fait ) ( data_a_traiter ).

    - J'ai deux tables, table_1 & table_2.

    - Dans table_1, j'ai 3 colonnes colone-1 (BIGINT autoincrement (+1) à chaque enregistrement), colone-2 (VARCHAR) & colone-date (DATE)

    - Dans table_2, j'ai 2 colonnes colone-1 (VARCHAR) & colone-2 (VARCHAR).

    table_1 ressemble à ça :


    [TH]Colone-1[/TH]
    [TH]colone-2[/TH]
    [TH]colone3[/TH]
    31 data05 2020-03-10
    32 data04 2020-03-10
    33 data11 2020-03-10
    34 data05 2020-03-11
    35 data03 2020-03-11
    36 data07 2020-03-11
    37 data03 2020-03-12
    38 data08 2020-03-13
    39 data10 2020-03-13
    40 data07 2020-03-13
    41 data06 2020-03-13
    42 data02 2020-03-13

    Un identifiant unique dans colone-1, des dataxx colonne-2 et une date dans colone-3

    table_2 ressemble à ça :


    [TH]colone-1[/TH]
    [TH]colone-2[/TH]
    data01 data08
    data02 data05
    data03 data03
    data04 data03
    data05 data05
    data06 data05
    data07 data03
    data08 data08
    data09 data03
    data10 data05
    data11 data08

    les dataxx se suivent, mais pas forcement et toutes les dataxx de la colone-1 sont uniques alors que les dataxx de la colone-2 regroupent un nombre déterminé de dataxx de la colone-1. Sur l'exemple on voit toutes

    les dataxx de la colone-2 sont forcément au moins une fois avec les dataxx de la colone-1 qui leur sont égales.

    Regroupement :

    data01 data08
    data08 data08
    data11 data08
    data02 data05
    data05 data05
    data06 data05
    data10 data05
    data03 data03
    data04 data03
    data07 data03
    data09 data03

    La requête permet de regrouper le nombre de data_a_traiter en fonction du regroupement de la colone-2

    exemple de ce qu'elle produit :

    3 data08
    4 data03
    4 data05

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT COUNT (table_1.colone-1) AS data_a_traiter, table_2.colone-2
    FROM table_1, table_2
    WHERE table_1.colone-date <= CURRENT_DATE AND table_1.colone-2 = table_2.colone-2
    GROUP BY table_2.colone-2
    ORDER BY data_a_traiter DESC;

  2. #2
    Membre averti
    Bonjour,

    Je n'ai pas compris la question/le problème. Que cherches-tu à obtenir? Quel résultat souhaites-tu afficher?

  3. #3
    Membre expert
    BIGINT ? autoincrement ?
    c'est pas du vocabulaire ORACLE DB, donc déjà vous n'êtes pas dans le bon forum…

  4. #4
    Candidat au Club
    Citation Envoyé par vanagreg Voir le message
    Bonjour,

    Je n'ai pas compris la question/le problème. Que cherches-tu à obtenir? Quel résultat souhaites-tu afficher?
    Oui, désolé je suis complétement autodidacte sur SQL, j'ai eu l'obligation de partir fissa de mon taf vendredi avec l'option de partir sans lancer un message à la mer ou en "balançant" rapidement mon problème, désolé.

    Ma requête me donne le nombre d’occurrences reliées à des regroupements.... C'est pas très claire, mais ce que je veux obtenir en plus c'est le total de la première colonne que j'ai nommée ( data_a_traiter COUNT (table_1.colone-1) AS data_a_traiter, ), combien d'enregistrements j'ai en faisant la somme de cette colonne, ici dans mon exemple 3 + 4 + 4 = 11. Je ne sais pas par où la prendre cette colonne que j'affiche ( c'est quoi son type, sa représentation ? ) ou comment la "manipuler" ? J'ai trouvé une commande COUNT ... AS sur Google et c'était ce que je voulais, mais je ne vois pas comment ça marche pour réutiliser le résultat autrement qu'en affichage alors que j'ai aussi besoin de le dénombrer.

    <<

    La requête permet de regrouper le nombre de data_a_traiter en fonction du regroupement de la colone-2

    exemple de ce qu'elle produit :

    3 data08
    4 data03
    4 data05

    >>

  5. #5
    Candidat au Club
    Citation Envoyé par JeitEmgie Voir le message
    BIGINT ? autoincrement ?
    c'est pas du vocabulaire ORACLE DB, donc déjà vous n'êtes pas dans le bon forum…
    Bonjour,

    Ha, désolé, j'utilise DBVisualizer d'Oracle Corporation et je croyais que c'était une base de données Oracle... C'est du DB2, c'est doncIBM, il faut que j'aille sur un forum IBM ?

  6. #6
    Expert éminent
    Il faudrait aller dans le forum db2 https://www.developpez.net/forums/f124/bases-donnees/db2/
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB

  7. #7
    Candidat au Club
    COUNT xx AS .. donne quel type d objet
    Bonjour,

    Ma requête me donne le nombre d’occurrences reliées à des regroupements.Ce que je veux obtenir en plus c'est le total de la première colonne que j'ai nommée data_a_traiter ( COUNT (table_1.colone-1) AS data_a_traiter, ) dans ma requête SQL.

    - J'ai deux tables, table_1 & table_2.

    - Dans table_1, j'ai 3 colonnes colone-1 (BIGINT autoincrement (+1) à chaque enregistrement), colone-2 (VARCHAR) & colone-date (DATE)

    - Dans table_2, j'ai 2 colonnes colone-1 (VARCHAR) & colone-2 (VARCHAR).

    table_1 peut ressembler à ça :

    Colone-1 colone-2 colone3
    31 data05 2020-03-10
    32 data04 2020-03-10
    33 data11 2020-03-10
    34 data05 2020-03-11
    35 data03 2020-03-11
    36 data07 2020-03-11
    37 data03 2020-03-12
    38 data08 2020-03-13
    39 data10 2020-03-13
    40 data07 2020-03-13
    41 data06 2020-03-13
    42 data02 2020-03-13

    Un identifiant unique dans colone-1, des dataxx colonne-2 et une date dans colone-3

    table_2 ressemble à ça :

    colone-1 colone-2
    data01 data08
    data02 data05
    data03 data03
    data04 data03
    data05 data05
    data06 data05
    data07 data03
    data08 data08
    data09 data03
    data10 data05
    data11 data08

    les dataxx se suivent, mais pas forcement et toutes les dataxx de la colone-1 sont uniques alors que les dataxx de la colone-2 regroupent un nombre determiné de dataxx de la colone-1. Sur l'exemple on voit toutes les dataxx de la colone-2 sont forcément au moins une fois avec les dataxx de la colone-1 qui leur sont egales.

    Exemple de regroupement :

    data01 data08
    data08 data08
    data11 data08

    data02 data05
    data05 data05
    data06 data05
    data10 data05

    data03 data03
    data04 data03
    data07 data03
    data09 data03

    La requête permet de regrouper le nombre de data_a_traiter en fonction du regroupement de la colone-2

    exemple de ce qu'elle produit :
    3 data08
    4 data03
    4 data05

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT COUNT (table_1.colone-1) AS data_a_traiter, table_2.colone-2
    FROM table_1, table_2
    WHERE table_1.colone-date <= CURRENT_DATE AND table_1.colone-2 = table_2.colone-2
    GROUP BY table_2.colone-2
    ORDER BY data_a_traiter DESC;

  8. #8
    Expert éminent sénior
    S'il s'agit de DB2 for Z/OS, alors le résultat du count() est d'un type BIGINT not null.

    cf. https://www.ibm.com/support/knowledg...bif_count.html

  9. #9
    Candidat au Club
    Donc je pourrais utiliser SUM (data_a_traiter) mais comment l'afficher ? Je ne vois pas où insérer le select qui me donnerait cette somme dans mon code...

  10. #10
    Expert éminent sénior
    Comme dans votre requête de votre réponse n°7 : à partir du moment où vous avez défini votre regroupement, vous pouvez utiliser tous les agrégats souhaités.

    Exemple

    Avec ce jeu d'essais
    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
    with tab1(C1, c2, c3, c4) as
        (select 1, 5, 12, 7   from sysibm.sysdummy1
         union all
         select 1, 6, 09, 4   from sysibm.sysdummy1
         union all
         select 1, 1, 15, 5   from sysibm.sysdummy1
         union all
         select 2, 0, 10, 1   from sysibm.sysdummy1
         union all
         select 2, 1, 08, 1   from sysibm.sysdummy1
         union all
         select 3, 4, 01, 1   from sysibm.sysdummy1
         union all
         select 4, 0, 00, 6   from sysibm.sysdummy1
         union all
         select 4, 5, 00, 7   from sysibm.sysdummy1
         union all
         select 4, 2, 00, 5   from sysibm.sysdummy1
        )
       , tab2 (c1, cx) as
        (select 1, 20  from sysibm.sysdummy1 
         union all
         select 3, 27  from sysibm.sysdummy1
         union all
         select 4, 12  from sysibm.sysdummy1
        )


    Et cette requête
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select T1.C1       as T1C1
         , max(T1.C2)  as MAXC2
         , min(T1.C2)  as MINC2
         , avg(T1.C3)  as AVGC3
         , min(T2.CX)  as T2CX
    from Tab1 T1
    left join Tab2 T2
      on T2.C1 = T1.C1
    group by T1.C1
    ;


    On obtient
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    T1C1 	MAXC2 	MINC2 	AVGC3 	T2CX
    1 	6 	1 	12 	20
    2 	1 	0 	9 	null
    3 	4 	4 	1 	27
    4 	5 	0 	0 	12


    Notez le remplacement de la jointure à l'ancienne (dans le WHERE) par la jointure norme SQL 1995 (JOIN ON) : c'est quand même plus clair de séparer le filtrage de la jointure
    Notez également l'utilisation d'alias de tables, plus pratiques à manipuler que des noms in extenso

  11. #11
    Candidat au Club
    Merci, je regarde cela

  12. #12
    Candidat au Club
    Si je fais cette requête (2) :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     SELECT table_1.colone-1 FROM table_
     WHERE table_1.colone-date <= CURRENT_DATE
     ORDER BY table_1.colone-1 DESC;


    J'obtiens ça :

    11
    12
    23
    24
    15
    16
    17
    28
    29
    10
    21

    Le nombre de ligne obtenues EST la somme que je cherche à obtenir. C'EST la somme de la colonne data_a_traiter soit 3 + 4 + 4 = 11 de ma requête (1) la première au début.

    Ma question revient a "mixer" les deux requêtes en une seule requête afin de m’éviter de lancer deux requêtes, la première qui me donne le résultat par les regroupements et la deuxième qui me donne le résultat sans les regroupements

  13. #13
    Expert éminent sénior
    Citation Envoyé par rndsgn Voir le message
    Si je fais cette requête (2) :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     SELECT table_1.colone-1 FROM table_
     WHERE table_1.colone-date <= CURRENT_DATE
     ORDER BY table_1.colone-1 DESC;


    Le nombre de ligne obtenues EST la somme que je cherche à obtenir. C'EST la somme de la colonne data_a_traiter soit 3 + 4 + 4 = 11 de ma requête (1) la première au début.
    Bonjour,

    L'expression de besoins est loin d'être claire, vous parlez de résultat obtenu égal à une somme alors que votre requête ne contient ni regroupement ni agrégat ...

    Citation Envoyé par rndsgn Voir le message

    Ma question revient a "mixer" les deux requêtes en une seule requête afin de m’éviter de lancer deux requêtes, la première qui me donne le résultat par les regroupements et la deuxième qui me donne le résultat sans les regroupements
    Ce serait beaucoup plus facile de vous aider si vous communiquiez un extrait réel du jeu de données en entrée (plutôt que data1, data2...), la description réelle des tables (plutôt que table1, colonne1...) et un exemple de résultat attendu en sortie.

  14. #14
    Candidat au Club
    Oui, je re-formule tout cela