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 :

L'inverse d'un UNION ALL?


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 22
    Points : 19
    Points
    19
    Par défaut L'inverse d'un UNION ALL?
    Salut.

    Voilà, j’utilise SQL pour une utilisation basique et je ne suis donc pas un utilisateur avancé.

    J’ai une table CHIMIE avec :
    Attributs
    Echantillon - A – B – C
    Valeurs
    Ech1 - 1 – 2 – 3
    Ech2 - 4 – 5 – 6

    J’utilise la fonction « UNION ALL » pour créer une vue « CHIMIE2 » :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT “A” AS ELEMENT , A AS VALEUR, ECHANTILLON as SAMPLE FROM CHIMIE
    UNION ALL
    SELECT “B” AS ELEMENT , B AS VALEUR, ECHANTILLON as SAMPLE FROM CHIMIE 
    UNION ALL
    SELECT “C” AS ELEMENT , C AS VALEUR, ECHANTILLON as SAMPLE FROM CHIMIE
    Résultat:
    Attribut
    Element – Valeur - Sample
    Valeurs
    A – 1 - Ech1
    A – 4 - Ech2
    B – 2 - Ech1
    B – 5 - Ech2
    C – 3 - Ech1
    C – 6 - Ech2

    Quelle serait la requête SQL pour faire l’inverse, pour passer d’une vue de type CHIMIE2 à CHIMIE?

    Merci.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Il faudrait une valeur supplémentaire pour savoir que les triplets (1, 2, 3) et (4, 5, 6) sont rapprochés ensemble.
    On pourrait utiliser le numéro de position par exemple, vérifiez si votre SGBD sait utiliser la fonction row_number().

    Pour votre question, vous pouvez regarder du côté de UNPIVOT (encore une fois, si votre SGBD supporte la syntaxe).

    Plus classiquement, on utilise des case (ça ne fonctionnera pas complètement pour votre exemple à cause de ma première remarque, aussi je fais un min histoire d'avoir au moins le premier triplet) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT
        min(case element when 'A' then valeur else null end) as A,
        min(case element when 'B' then valeur else null end) as B,
        min(case element when 'C' then valeur else null end) as C
    FROM
        chimie2
    Un exemple en prenant le numéro de ligne :
    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
    SELECT
        SR.rk,
        min(case SR.element when 'A' then SR.valeur else null end) as A,
        min(case SR.element when 'B' then SR.valeur else null end) as B,
        min(case SR.element when 'C' then SR.valeur else null end) as C
    FROM
        (
        SELECT
            row_number() over(partition by element order by valeur asc) rk,
            element,
            valeur
        FROM
            chimie2
        ) as SR
    GROUP BY
        SR.rk

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 22
    Points : 19
    Points
    19
    Par défaut
    Salut Waldar.

    Merci pour la réponse. En fait, j'ai bien une valeur qui lie A, B & C : le numéro d'échantillon (cf mon premier post que j'ai édité).

    Je ne connais les CASE mais si je peux m'en servir pour passer de CHIMIE2 à CHIMIE en me servant des numéros d'échantillon, ce serait parfait.

    Je vais voir ça demain.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Dans ce cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT
        ECHANTILLON,
        min(CASE element WHEN 'A' THEN valeur ELSE NULL END) AS A,
        min(CASE element WHEN 'B' THEN valeur ELSE NULL END) AS B,
        min(CASE element WHEN 'C' THEN valeur ELSE NULL END) AS C
    FROM
        chimie2
    GROUP BY
        ECHANTILLON

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 22
    Points : 19
    Points
    19
    Par défaut
    Excellent, merci Waldar.

    Cela me mène à une autre question. Si le nombre d’analyse varie d’un échantillon à l’autre avec par exemple :
    Echantillon1 = Analyses A – B – C
    Echantillon2 = Analyses A – B – C – D

    Y aurait-il un moyen simple de passer de CHIMIE2 à CHIMIE pour l’échantillon 2 par exemple en partant du principe que je ne connais pas le nombre d’analyses faites par échantillons.

    De mon point de vue, j’imagine qu’il faut d’abord créer un genre de variable en récupérant les analyses faites pour l’échantillon 2 avec un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ANALYSES 
    FROM CHIMIE2 
    WHERE ECHANTILLON = « Ech2 »
    Après, il faudrait boucler dans cette liste pour créer une requête avec des CASE, mais est-ce possible en SQL ?

    Si c’est impossible, est-ce qu’une requête « géante » comme celle que tu m’as donnée comprenant tous les types d’analyses existants dans la table CHIMIE2 fonctionnerait ?
    Pour l’exemple d’ici, ce serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT
        ECHANTILLON,
        min(CASE element WHEN 'A' THEN valeur ELSE NULL END) AS A,
        min(CASE element WHEN 'B' THEN valeur ELSE NULL END) AS B,
        min(CASE element WHEN 'C' THEN valeur ELSE NULL END) AS C,
        min(CASE element WHEN 'C' THEN valeur ELSE NULL END) AS D	
    FROM
        chimie2
    GROUP BY
        ECHANTILLON
    Pour l’échantillon 1, j’aurais une colonne « D » sans valeur ou bien est-ce que cela va me renvoyer une erreur?

    Merci.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 386
    Points
    18 386
    Par défaut
    C'est le problème de ce genre de construction, on est limité sur ce qu'on peut faire en base de données.
    Il faut impérativement connaître toutes les valeurs pour le faire en SQL.

    Vous pouvez construire la requête dynamiquement avec du PL/SQL ; T-SQL ou n'importe quel langage de programmation.

  7. #7
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 22
    Points : 19
    Points
    19
    Par défaut
    Ok, merci, c'est bien ce que je pensais.

    La solution avec CASE est déjà très pratique, je pense que je vais me débrouiller avec ça ou bien je vais voir pour bidouiller un truc en VBA.

    Alex.

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

Discussions similaires

  1. Illegal mix of collations avec UNION ALL
    Par lodan dans le forum Outils
    Réponses: 1
    Dernier message: 03/05/2007, 18h05
  2. order by avec un union ALL
    Par roxxxy dans le forum Langage SQL
    Réponses: 1
    Dernier message: 20/03/2007, 15h59
  3. UNION ALL et ORDER BY
    Par roxxxy dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/03/2007, 15h36
  4. Calcul de % sur une requête UNION ALL
    Par lodan dans le forum Langage SQL
    Réponses: 4
    Dernier message: 08/03/2007, 14h20
  5. union all couteux ?
    Par Maitre B dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 16/11/2004, 09h26

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