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

SQL Oracle Discussion :

Reproduire un tableau en sql


Sujet :

SQL Oracle

  1. #1
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Par défaut Reproduire un tableau en sql
    Bonjour,

    Je cherche à faire une requête pour reproduire le tableau ci-dessous:

    Nom : ccapture.JPG
Affichages : 235
Taille : 85,1 Ko

    mais je ne sais pas comment m'y prendre et ça m'a l'air très difficile à réaliser.


    Je voudrais récupérer le résultat de la requête pour l'afficher dans une datagridview en c#.

    Je trouve que la complexité se trouve dans le fait qu'il faut pour chaque agence lui afficher les départements et pour chaque département et pour chaque mois calculer le chiffre d'affaires calculés.

    Merci,

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Un petit jeu d'essai: tables et quelques données ?

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    tout simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select agence, department, extract(month from datevente), sum(montant)
    from tab 
    group by agence, department, extract(month from datevente)
    le reste n'est que du formatage

  4. #4
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Par défaut
    Bonjour,

    J'ai essayé de faire la requête suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT SUM(T1.COL1) AS ALIAS, 
    	(SELECT DISTINCT(T2.COL1) FROM TABLE2 T2 WHERE T2.COL2 = 3 AND T2.COL3 = 1 AND T1.COL2 = (SELECT CAST((T2.CACC) AS INT) FROM DUAL)) AS ALIAS1, 
    	(SELECT DISTINCT(T2.COL1) FROM TABLE2 T2 WHERE T2.COL2 = 12 AND T2.COL3 = 1 AND T1.COL3 = (SELECT CAST((T2.CACC) AS INT) FROM DUAL)) AS ALIAS2 
      FROM TABLE1 T1
     WHERE T1.COL5 BETWEEN (SUBSTR('mm/yyyy',4)||SUBSTR('mm/yyyy',1,2))
       AND (SUBSTR('mm/yyyy',4)||SUBSTR('mm/yyyy',1,2))
       AND T1.COL2 = 3
       AND T1.COL3 = 1
       AND T1.COL4 =1
       GROUP BY ALIAS1, ALIAS2;
    et j'ai l'erreur ci-dessous:

    ORA-00904: "ALIAS2" : identificateur non valide
    Merci,

  5. #5
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    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
    Par défaut
    Il me semble que mettre un alias dans le group by n'est pas possible.

  6. #6
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Par défaut
    Si ça marche avec les alias!

    Cette requête ci-dessous a bien fonctionné

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT SUM(T1.COL1) AS ALIAS, 
    	(SELECT DISTINCT(T2.COL1) FROM TABLE2 T2 WHERE T2.COL2 = 3 AND T2.COL3 = 1 AND T1.COL2 = (SELECT CAST((T2.CACC) AS INT) FROM DUAL)) AS ALIAS1
      FROM TABLE1 T1
     WHERE T1.COL5 BETWEEN (SUBSTR('mm/yyyy',4)||SUBSTR('mm/yyyy',1,2))
       AND (SUBSTR('mm/yyyy',4)||SUBSTR('mm/yyyy',1,2))
       AND T1.COL2 = 3
       AND T1.COL3 = 1
       AND T1.COL4 =1
       GROUP BY ALIAS1;

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    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 136
    Par défaut
    Citation Envoyé par lola06 Voir le message
    Il me semble que mettre un alias dans le group by n'est pas possible.
    Ça dépend des SGBD...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  8. #8
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Par défaut
    Comment expliquer qu'avec un alias ALIAS1 ça fonctionne et ça ne fonctionne avec les deux ALIAS1 et ALIAS2

    Comment puis-je représenter autrement la requête ?

    Merci,

  9. #9
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Pourquoi ça marche avec alias1 .. aucune idée. par contre on peut modifier la requête aisément

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select SUM(COL1) as alias, alias1, alias2
    from (SELECT T1.COL1) col1, 
    	(SELECT DISTINCT(T2.COL1) FROM TABLE2 T2 WHERE T2.COL2 = 3 AND T2.COL3 = 1 AND T1.COL2 = (SELECT CAST((T2.CACC) AS INT) FROM DUAL)) AS ALIAS1, 
    	(SELECT DISTINCT(T2.COL1) FROM TABLE2 T2 WHERE T2.COL2 = 12 AND T2.COL3 = 1 AND T1.COL3 = (SELECT CAST((T2.CACC) AS INT) FROM DUAL)) AS ALIAS2 
      FROM TABLE1 T1
     WHERE T1.COL5 BETWEEN (SUBSTR('mm/yyyy',4)||SUBSTR('mm/yyyy',1,2))
       AND (SUBSTR('mm/yyyy',4)||SUBSTR('mm/yyyy',1,2))
       AND T1.COL2 = 3
       AND T1.COL3 = 1
       AND T1.COL4 =1
    )
    GROUP BY ALIAS1, ALIAS2;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT SUM(T1.COL1) alias, 
    	(SELECT DISTINCT(T2.COL1) FROM TABLE2 T2 WHERE T2.COL2 = 3 AND T2.COL3 = 1 AND T1.COL2 = (SELECT CAST((T2.CACC) AS INT) FROM DUAL)) AS ALIAS1, 
    	(SELECT DISTINCT(T2.COL1) FROM TABLE2 T2 WHERE T2.COL2 = 12 AND T2.COL3 = 1 AND T1.COL3 = (SELECT CAST((T2.CACC) AS INT) FROM DUAL)) AS ALIAS2 
      FROM TABLE1 T1
     WHERE T1.COL5 BETWEEN (SUBSTR('mm/yyyy',4)||SUBSTR('mm/yyyy',1,2))
       AND (SUBSTR('mm/yyyy',4)||SUBSTR('mm/yyyy',1,2))
       AND T1.COL2 = 3
       AND T1.COL3 = 1
       AND T1.COL4 =1
    GROUP BY (SELECT DISTINCT(T2.COL1) FROM TABLE2 T2 WHERE T2.COL2 = 3 AND T2.COL3 = 1 AND T1.COL2 = CAST(T2.CACC AS INT) ), 
    	(SELECT DISTINCT(T2.COL1) FROM TABLE2 T2 WHERE T2.COL2 = 12 AND T2.COL3 = 1 AND T1.COL3 =  CAST(T2.CACC AS INT) )
    PS : pas obligé de faire un select from dual pour faire un cast

  10. #10
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Ca marché pas avec Oracle
    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
     
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
    Connected as mni
     
    SQL> 
    SQL> Select department_id as alias1, count(*)
      2    From employees e
      3  group by alias1
      4  /
     
    Select department_id as alias1, count(*)
      From employees e
    group by alias1
     
    ORA-00904: "ALIAS1" : identificateur non valide
     
    SQL>
    Ni l'idée d'utiliser des sous-requêtes scalaires dans le group by ne marche pas
    Restrictions on the GROUP BY Clause: This clause is subject to the following restrictions:

    •You cannot specify LOB columns, nested tables, or varrays as part of expr.

    •The expressions can be of any form except scalar subquery expressions.

    •If the group_by_clause references any object type columns, then the query will not be parallelized.

    [Edit]
    Une sous-requête scalaire peut être remplacée par une jointure externe.
    [/Edit]

  11. #11
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Par défaut
    Bonjour,

    Pourquoi ça marche avec alias1 .. aucune idée. par contre on peut modifier la requête aisément
    Je ne comprends pas la première requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT SUM(COL1) AS alias, alias1, alias2
    FROM (SELECT T1.COL1) col1, 
    	(SELECT DISTINCT(T2.COL1) FROM TABLE2 T2 WHERE T2.COL2 = 3 AND T2.COL3 = 1 AND T1.COL2 = (SELECT CAST((T2.CACC) AS INT) FROM DUAL)) AS ALIAS1, 
    	(SELECT DISTINCT(T2.COL1) FROM TABLE2 T2 WHERE T2.COL2 = 12 AND T2.COL3 = 1 AND T1.COL3 = (SELECT CAST((T2.CACC) AS INT) FROM DUAL)) AS ALIAS2 
      FROM TABLE1 T1
     WHERE T1.COL5 BETWEEN (SUBSTR('mm/yyyy',4)||SUBSTR('mm/yyyy',1,2))
       AND (SUBSTR('mm/yyyy',4)||SUBSTR('mm/yyyy',1,2))
       AND T1.COL2 = 3
       AND T1.COL3 = 1
       AND T1.COL4 =1
    )
    GROUP BY ALIAS1, ALIAS2;
    Et lorsque j'exécute la seconde requête,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT SUM(T1.COL1) alias, 
    	(SELECT DISTINCT(T2.COL1) FROM TABLE2 T2 WHERE T2.COL2 = 3 AND T2.COL3 = 1 AND T1.COL2 = (SELECT CAST((T2.CACC) AS INT) FROM DUAL)) AS ALIAS1, 
    	(SELECT DISTINCT(T2.COL1) FROM TABLE2 T2 WHERE T2.COL2 = 12 AND T2.COL3 = 1 AND T1.COL3 = (SELECT CAST((T2.CACC) AS INT) FROM DUAL)) AS ALIAS2 
      FROM TABLE1 T1
     WHERE T1.COL5 BETWEEN (SUBSTR('mm/yyyy',4)||SUBSTR('mm/yyyy',1,2))
       AND (SUBSTR('mm/yyyy',4)||SUBSTR('mm/yyyy',1,2))
       AND T1.COL2 = 3
       AND T1.COL3 = 1
       AND T1.COL4 =1
    GROUP BY (SELECT DISTINCT(T2.COL1) FROM TABLE2 T2 WHERE T2.COL2 = 3 AND T2.COL3 = 1 AND T1.COL2 = CAST(T2.CACC AS INT) ), 
    	(SELECT DISTINCT(T2.COL1) FROM TABLE2 T2 WHERE T2.COL2 = 12 AND T2.COL3 = 1 AND T1.COL3 =  CAST(T2.CACC AS INT) )
    j'obtiens l'erreur suivante:

    ORA-22818: expressions de sous-interrogation non autorisées ici
    22818. 00000 - "subquery expressions not allowed here"
    *Cause: An attempt was made to use a subquery expression where these
    are not supported.
    *Action: Rewrite the statement without the subquery expression.
    Erreur à la ligne 10, colonne 12
    Merci,

  12. #12
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par Jinkas Voir le message
    ...
    Et lorsque j'exécute la seconde requête,
    ...
    j'obtiens l'erreur suivante:
    Je vous l’ai déjà dit ! QED

  13. #13
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Par défaut
    Je vois ce que vous dites mais j'ai du mal à comprendre comment faire ma requête?

    Peut être que créer une procédure stockée et des curseurs est plus facile à mettre en place mais aussi moins pratique?

  14. #14
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par Jinkas Voir le message
    ...Peut être que créer une procédure stockée et des curseurs est plus facile à mettre en place ...
    Non, une requête SQL suffit.

  15. #15
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Par défaut
    Je ne vois pas comment récupérer la valeur du champs t2.col1 en tant que (alias1) et l'alias2 qui correspond au même champs (t2.col1) dans mon select.
    La différence entre les 2 alias c'est dans les valeurs de (t2.col2) mais il faut dans les 2 cas prendre en considération t2.col3 = 1.

    Est ce que devrais-je mettre les 2 select représentants l'alias1 et l'alias2 dans le from en plus de la table table1?

  16. #16
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Par défaut
    Bonjour,

    J'ai fait ceci et ça a l'air de fonctionner:

    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 SUM(T1.COL1) ALIAS, A.COL1, B.COL2
    FROM TABLE1 T1, 
    	(SELECT DISTINCT(COL1), COL4 *
    	 FROM TABLE2
    	 WHERE COL2 = 3
    	 AND COL3 = 1) A,
    	(SELECT DISTINCT(COL1), COL4
    	 FROM TABLE2
    	 WHERE COL2 = 12
    	 AND COL3 = 1) B
    WHERE T1.COL5 BETWEEN (SUBSTR('mm/yyyy',4)||SUBSTR('mm/yyyy',1,2))
    AND (SUBSTR('mm/yyyy',4)||SUBSTR('mm/yyyy',1,2))
    AND CAST((A.COL4) AS INT) = T1.COL2
    AND T1.COL2 = 3
    AND CAST((B.COL4) AS INT) = T1.COL3
    AND T1.COL3 = 1
    AND T1.COL4 =1
    GROUP BY A.COL1, B.COL1;
    Cependant, j'aimerai savoir s'il peut être optimisé?

    Merci,

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

Discussions similaires

  1. Difficulté a reproduire un tableau
    Par AuraHxC dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 2
    Dernier message: 13/06/2010, 14h48
  2. Tableau Pl SQL
    Par Herveg dans le forum PL/SQL
    Réponses: 2
    Dernier message: 10/05/2010, 09h26
  3. [MySQL] Afficher les variables provenant d'un tableau via SQL
    Par Ma2x. dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 08/12/2009, 12h25
  4. Tableau pl sql
    Par fatati dans le forum SQL
    Réponses: 3
    Dernier message: 13/11/2007, 16h59
  5. [Oracle] Tableau résultat Sql et casse
    Par cbroissa dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 12/04/2006, 23h44

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