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 :

Rollup et multilignes


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Par défaut Rollup et multilignes
    Bonjour,

    Dans le code ci-dessous, je fais des sommes avec des 'case'
    La table comporte plusieurs lignes pour chaque date.

    Je ne sais pas comment faire pour indiquer que pour une même date et un même matricule si on trouve dans les lignes le motif DISPO et SPOASTJ de ne pas mettre la valeur à 1
    Merci pour votre aide :

    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
    SELECT h.DAT, h.MOTIF,
    SUM(
    		CASE
    			WHEN  h.MOTIF = 'SPOASTJ' THEN 1
    			ELSE 0 
    		  END
    	) AS ASTJ,
    SUM(
    		CASE
    			WHEN  (h.MOTIF = 'DISPO' AND h.HRADEB = '480' AND h.HRAFIN = '1920'AND h.MOTIF != 'SPOASTJ')  OR (h.MOTIF = 'DISPO' AND h.HRADEB = '480' AND h.HRAFIN = '1200')  THEN 1
    			ELSE 0 
    		  END
    	) AS DISPJOUR,
    SUM(
    		CASE
    			WHEN (h.MOTIF = 'DISPO' AND h.HRADEB = '480' AND h.HRAFIN = '1920') OR (h.MOTIF = 'DISPO' AND h.HRADEB = '1200' AND h.HRAFIN = '1920') THEN 1
    			ELSE 0
    		  END
    	) AS DISPNUIT,
    SUM(
    		CASE
    			WHEN (h.MOTIF = 'SPOG12JV' OR h.MOTIF = 'SPOG24JV') THEN 1
    			ELSE 0
    		END
    	) AS POURVUJOUR,
    SUM(
    		CASE
    			WHEN (h.MOTIF = 'SPOG12NV' OR h.MOTIF = 'SPOG24NV') THEN 1
    			ELSE 0
    		END
    	) AS POURVUNUIT
    FROM HOPHABS h
    INNER JOIN HOPEMPL e ON e.MATRI = h.MATRI
    WHERE (h.MOTIF = 'DISPO' Or h.MOTIF ='SPOASTJ' OR (SUBSTR(h.MOTIF, 1, 4) = 'SPOG' AND SUBSTR(h.MOTIF, 8,1) = 'V'))
    AND EXTRACT (YEAR FROM h.DAT) = 2012 
    AND (((h.JOUR BETWEEN 1 and 7) AND h.TYPJOU = 'F' ) OR ((h.JOUR = 6 Or h.JOUR = 7) AND h.TYPJOU != 'F'))
    GROUP BY h.DAT,ROLLUP (h.MOTIF)
    ORDER BY h.DAT

  2. #2
    Membre très actif
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Par défaut
    dans cette partie de code ça ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SUM(
    		CASE
    			WHEN  (h.MOTIF = 'DISPO' AND h.HRADEB = '480' AND h.HRAFIN = '1920'AND h.MOTIF != 'SPOASTJ')  OR (h.MOTIF = 'DISPO' AND h.HRADEB = '480' AND h.HRAFIN = '1200')  THEN 1
    			ELSE 0 
    		  END
    	) AS DISPJOUR,

    Les retours sur DISPJOUR sont à 1 même si il y a un enregistrement = SPOASTJ
    pour une même date et un même matricule.

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    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
    Par défaut
    Il faudrait un jeu de données, je pense que vous avez un problème de division relationnelle mais je n'en suis pas certain.
    Et préciser votre SGBD et sa version.

  4. #4
    Membre très actif
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Par défaut
    Le SGBD est Oracle.

    Les donnée sont retournées comme ci-dessous.
    Dasn la colonne JOUR pour DISPO, je devrais être à 3 au lieu de 4, car un matricule est à la fois DISPO et SPOASTJ sur la même date.
    DAT      MOTIF    ASTJ JOUR NUIT POURVUJOUR POURVUNUIT
    -------- -------- ---- ---- ---- ---------- ----------
    01/01/12 DISPO       0    4    4          0          0
    01/01/12 SPOASTJ     4
    01/01/12 SPOG12JV    0    0    0          3          0
    01/01/12 SPOG12NV    0    0    0          0          4
    01/01/12             4    4    4          3          4

  5. #5
    Membre très actif
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Par défaut
    bonjour,

    Quelqu'un a-t-il une solution ?

    Merci

  6. #6
    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
    Pourriez-vous fournir le jeu d’essai demandé et non pas seulement le résultat de votre requête ?

  7. #7
    Membre très actif
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Par défaut
    Bonjour,

    Vous trouverez, en exemple, un jeux de données pour un matricule.

    Merci pour votre aide
    Fichiers attachés Fichiers attachés

  8. #8
    Membre très actif
    Inscrit en
    Avril 2005
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 238
    Par défaut
    Le jeu de données est-il suffisant ?

  9. #9
    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
    Si j’ai bien compris votre demande vous avez besoin de savoir pour chaque tuple matricule, date si les deux valeurs DISPO et SPOASTJ sont présentes parmi vos données.
    Voilà une solution qui emploie des fonctions analytiques : Min et Max après avoir transformées les valeurs de la zone Motif pour obtenir Min pour DISPO et Max pour SPOASTJ (la table t_horaire contient les données du votre fichier excel)
    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
     
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
    Connected as mni
     
    SQL> 
    SQL> Select *
      2    From (
      3          Select a.matri, a.dat, a.motif, a.hradeb, a.hrafin,
      4                 min(col) over (partition by matri, dat) minm,
      5                 max(col) over (partition by matri, dat) maxm
      6            From (
      7                  Select t.matri, t.dat, t.motif, t.hradeb, t.hrafin,
      8                         Case Motif
      9                           When 'DISPO' Then 1
     10                           When 'SPOASTJ' Then 9
     11                         End col
     12                    From t_horaire t
     13                 ) a
     14         )
     15  Where  minm != maxm
     16  /
     
      MATRI DAT         MOTIF                           HRADEB  HRAFIN       MINM       MAXM
    ------- ----------- ------------------------------ ------- ------- ---------- ----------
       5243 01/01/2012  DISPO                              480    1920          1          9
       5243 01/01/2012  SPOASTJ                            480    1200          1          9
       5243 01/01/2012  SPOG12NV                          1200    1920          1          9
     
    SQL>

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

Discussions similaires

  1. [JTable] Cellules multilignes dans un jtable
    Par chesteric31 dans le forum Composants
    Réponses: 15
    Dernier message: 06/06/2005, 14h50
  2. Connaître la hauteur d'un texte multilignes
    Par Crisanar dans le forum Windows
    Réponses: 2
    Dernier message: 22/11/2004, 23h01
  3. [TCombobox] Item multiligne
    Par Bernard Grosdoy dans le forum Composants VCL
    Réponses: 9
    Dernier message: 28/09/2004, 10h11
  4. StringGrid, multiligne et word wrap
    Par Dajon dans le forum C++Builder
    Réponses: 7
    Dernier message: 17/09/2003, 17h15
  5. [langage] Extraire un block dans une variable multiligne
    Par |DUCATI| DesMo dans le forum Langage
    Réponses: 9
    Dernier message: 11/02/2003, 14h56

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