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

Oracle Discussion :

Aide pour une requete!


Sujet :

Oracle

  1. #1
    AkA
    AkA est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 16
    Points : 10
    Points
    10
    Par défaut Aide pour une requete!
    Bonjour,

    Bon je sais que cela va vous paraitre tout bete, mais c'est ce qu'on appellerai une requete croisé sous access. Par contre sur oracle, comment fait-on?

    Voici les données:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Date          Type 
    10/12/06       A
    10/12/06       A
    10/12/06       C
    11/12/06       B
    11/12/06       A
    12/12/06       B
    Et comme résultat pour ma requete, je souhaiterais ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Date       Type A     Type B     Type C
    10/12/06     2         0           1
    11/12/06     1         1           0
    12/12/06     0         1           0
    Voilà, mais je sais absolument pas comment m'y prendre en SQL.

    Merci d'avance
    AKA

  2. #2
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 120
    Points : 88
    Points
    88
    Par défaut
    Voici ce que je propose. Un peu compliqué mais ça marche. Peut-être qu'un gourou aura une solution plus simple?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT DISTINCT vdate
                  , (SELECT COUNT (*)
                       FROM nl_test_d a
                      WHERE m.vdate = a.vdate AND TYPE = 'A')
                  , (SELECT COUNT (*)
                       FROM nl_test_d a
                      WHERE m.vdate = a.vdate AND TYPE = 'B')
                  , (SELECT COUNT (*)
                       FROM nl_test_d a
                      WHERE m.vdate = a.vdate AND TYPE = 'C')
               FROM nl_test_d m
    Par contre, je pense à un truc juste à l'instant : je ne connais pas bien Access mais tu sembles dire qu'il sait faire ça : je suppose que tu as sans doute moyen de voir le code SQL que Access a généré pour faire ça?

  3. #3
    AkA
    AkA est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Merci de ta réponse Nico57. Malheuresement, cela ne correspond pas à ce que je souhaite, parce que dans ton cas pour chaque ligne, le total de A, B et C pour tous les enregistrements est retourné. Alors que je souhaite le détail par jour !

    Sinon, effectivement, en code SQL il s'agit de la fonction TRANSFORM/PIVOT. Mais c'est une fonction made-in access qui n'existe pas ailleurs. C'est pour ce la que je cherche à savoir comment faire sous oracle!

    Merci tout de meme!

  4. #4
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Il y a probablement plus simple (et plus rapide) mais ça marche aussi:

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    SQL>
    SQL> CREATE TABLE dt (d DATE, t CHAR(1));
     
    Table créée.
     
    SQL>
    SQL> INSERT INTO dt VALUES ('10/12/06', 'A');
     
    1 ligne créée.
     
    SQL> INSERT INTO dt VALUES ('10/12/06', 'A');
     
    1 ligne créée.
     
    SQL> INSERT INTO dt VALUES ('10/12/06', 'C');
     
    1 ligne créée.
     
    SQL> INSERT INTO dt VALUES ('11/12/06', 'B');
     
    1 ligne créée.
     
    SQL> INSERT INTO dt VALUES ('11/12/06', 'A');
     
    1 ligne créée.
     
    SQL> INSERT INTO dt VALUES ('12/12/06', 'B');
     
    1 ligne créée.
     
    SQL>
    SQL> COMMIT;
     
    Validation effectuée.
     
    SQL>
    SQL> SELECT d As "DATE", SUM(count_A) AS "Type A", SUM(count_B) AS "Type B", SUM
    (count_C) AS "Type C"
      2  FROM
      3  (
      4  SELECT DISTINCT d, count_A, 0 AS count_B, 0 AS count_C FROM (
      5          SELECT d,  COUNT(t) OVER (PARTITION BY d) count_A FROM (
      6                  SELECT * FROM dt WHERE t ='A'))
      7  UNION
      8  SELECT DISTINCT d, 0 AS count_A, count_B, 0 AS count_C FROM (
      9          SELECT d,  COUNT(t) OVER (PARTITION BY d) count_B FROM (
     10                  SELECT * FROM dt WHERE t ='B'))
     11  UNION
     12  SELECT DISTINCT d, 0 AS count_A, 0 AS count_B, count_C FROM (
     13          SELECT d, COUNT(t) OVER (PARTITION BY d) count_C FROM (
     14                  SELECT * FROM dt WHERE t ='C'))
     15  )
     16  GROUP BY d ORDER BY d;
     
    DATE         Type A     Type B     Type C
    -------- ---------- ---------- ----------
    10/12/06          2          0          1
    11/12/06          1          1          0
    12/12/06          0          1          0
     
    SQL>
    La requête utilise les fonctions analytiques (voir: http://lalystar.developpez.com/fonctionsAnalytiques/)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    COUNT(col1) OVER (PARTITION BY col2)
    ainsi que les inline views:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT ... FROM ( <une autre requête SQL>)

  5. #5
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Une solution plus simple et plus efficace:

    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
     
      1  SELECT
      2  DISTINCT
      3  d AS "DATE",
      4  SUM(ta) OVER (PARTITION BY d) AS "Type A",
      5  SUM(tb) OVER (PARTITION BY d) AS "Type B",
      6  SUM(tc) OVER (PARTITION BY d) AS "Type C"
      7  FROM
      8  (
      9  SELECT
     10  d,
     11  (CASE WHEN t='A' THEN 1 ELSE 0 END) ta,
     12  (CASE WHEN t='B' THEN 1 ELSE 0 END) tb,
     13  (CASE WHEN t='C' THEN 1 ELSE 0 END) tc
     14  FROM dt
     15  )
     16* ORDER BY d
    SQL> /
     
    DATE         Type A     Type B     Type C
    -------- ---------- ---------- ----------
    10/12/06          2          0          1
    11/12/06          1          1          0
    12/12/06          0          1          0

  6. #6
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 120
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par AkA
    Merci de ta réponse Nico57. Malheuresement, cela ne correspond pas à ce que je souhaite, parce que dans ton cas pour chaque ligne, le total de A, B et C pour tous les enregistrements est retourné. Alors que je souhaite le détail par jour !
    Ah non non, je l'ai testée, avec tes données, je suis CERTAIN que ça marche, tu as peut-être oublié des jointures en recopiant mon code.

    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
     
    SQL> select * from nl_test_d;
     
    VDATE     T
    --------- -
    10-DEC-06 A
    10-DEC-06 A
    10-DEC-06 C
    11-DEC-06 B
    11-DEC-06 A
    12-DEC-06 B
     
    6 rows selected.
     
    SQL> /* Formatted on 2006/04/14 12:54 (Formatter Plus v4.8.5) */
    SQL> SELECT DISTINCT vdate
      2                , (SELECT COUNT (*)
      3                     FROM nl_test_d a
      4                    WHERE m.vdate = a.vdate AND TYPE = 'A') TotalA
      5                , (SELECT COUNT (*)
      6                     FROM nl_test_d a
      7                    WHERE m.vdate = a.vdate AND TYPE = 'B') TotalB
      8                , (SELECT COUNT (*)
      9                     FROM nl_test_d a
     10                    WHERE m.vdate = a.vdate AND TYPE = 'C') TotalC
     11             FROM nl_test_d m;
     
    VDATE         TOTALA     TOTALB     TOTALC
    --------- ---------- ---------- ----------
    10-DEC-06          2          0          1
    11-DEC-06          1          1          0
    12-DEC-06          0          1          0
    CQFD

  7. #7
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Le SQL n'est pas fait pour faire du cosmétique
    Donc pour arriver a mettre en page des résultats tel du reporting, il te faudra des requetes plus compliquées, donc peu performantes et pas évolutives du tout !!
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  8. #8
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Une solution plus simple et plus efficace ( )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT d AS "DATE", 
           SUM(CASE WHEN t='A' THEN 1 ELSE 0 END) as ta,
           SUM(CASE WHEN t='B' THEN 1 ELSE 0 END) as tb,
           SUM(CASE WHEN t='C' THEN 1 ELSE 0 END) as tc 
    FROM dt
    GROUP BY d
    ORDER BY d
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DATE		TA	TB	TC
    10/12/06	2	0	1
    11/12/06	1	1	0
    12/12/06	0	1	0
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  9. #9
    AkA
    AkA est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Bon, bah je crois que j'ai largement de quoi faire ma requete !
    La solution de Médiat me convient parfaitement!

    Je suis tout à fait d'accord sur le fait que le SQL n'est pas fait pour du cosmétique, malheuresement quand on n'as pas d'autres outils pour du reporting, il n'y à pas bien le choix!
    @Nico57: Effectivement, tu as raison, je n'avais pas fait gaffe mais c'est effectivement juste!

    Merci à tous!

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

Discussions similaires

  1. Besoin d'aide pour une requete
    Par jnc dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/07/2005, 11h54
  2. aide pour une requete
    Par graphicsxp dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 29/03/2005, 15h02
  3. Aide pour une requete SQL
    Par hpghost dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 08/01/2005, 15h01
  4. Aide pour une requete SQL
    Par hpghost dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 08/01/2005, 10h15
  5. Aide pour une requete ... "COUNT(*)"
    Par mechantebestiole dans le forum Langage SQL
    Réponses: 13
    Dernier message: 25/05/2004, 16h27

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