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 :

Requête SQL pour fusionner des colonnes


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 97
    Points : 52
    Points
    52
    Par défaut Requête SQL pour fusionner des colonnes
    Bonjour,

    J'ai besoin d'aide pour une requête qu'il faut que je fasse, mais je ne suis pas sûr qu'elle soit possible.

    Pour résumer, j'ai une table SUIVI (un historique) avec plusieurs rubriques dont 6 rubriques de date (Suivi.DateDemande, DateReception, DateDistribution, DatePerte, DateFinAttribution, DateRestitution) et l'identifiant de la carte concernée par ces suivis (IDCarte). Je dois importer les données de cette table dans une autre table Suivi qui, elle, ne contient qu'une rubrique de date dateOpération ainsi qu'une rubrique Opération (Demande, Reception, Distribution, Perte...) et une rubrique IDCarte.
    Je souhaiterais importer les 6 rubriques de date du premier SUIVI dans la rubrique dateOpérationen conservant toutes les dates et en les liant à leur opération respective.

    Un petit exemple pour mieux comprendre :

    Contenu du premier SUIVI :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SUIVI1 : DateDemande = 01/01/2001, DateReception = 02/02/2001, DateRestitution = 05/05/2005, IDCarte = 000
    SUIVI2 : DateDemande = 01/01/2001, DateReception = 02/02/2001, DatePerte = 02/03/2004, IDCarte = 111
    Je voudrais que le contenu du second Suivi soit ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Suivi1 : dateOperation = 01/01/2001, Opération = 'Demande', IDCarte = 000
    Suivi2 : dateOperation = 01/01/2001, Opération = 'Demande', IDCarte = 111
    Suivi3 : dateOperation = 02/02/2001, Opération = 'Reception', IDCarte = 000
    Suivi4 : dateOperation = 02/02/2001, Opération = 'Reception', IDCarte = 111
    Suivi5 : dateOperation = 02/03/2004, Opération = 'Perte', IDCarte = 111
    Suivi6 : dateOperation = 05/05/2005, Opération = 'Restitution', IDCarte = 000
    (l'ordre importe peu)

    Quel code SQL pourrait m'insérer mes valeurs comme je le désire ? J'ai eu beau chercher, je n'ai rien trouvé de concluant

    Merci d'avance,

    Aenur.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 97
    Points : 52
    Points
    52
    Par défaut
    J'ai trouvé une partie de la solution en ouvrant par hasard des sujets.
    Pour l'instant je fait ses SELECT et je stocke les résultats dans un tableur Excel que j'importerai ensuite.

    J'utilise un UNION pour chaque SELECT avec l'une des dates, ça me fait un truc dans ce genre là :

    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
    SELECT DateDemande AS dateOperation,
    'Demande' AS Opération,
    IDCarte
    FROM SUIVI
    UNION
    SELECT DateReception AS dateOperation,
    'Reception' AS Opération,
    IDCarte
    FROM SUIVI
    UNION
    SELECT DateDistribution AS dateOperation,
    'Distribution' AS Opération,
    IDCarte
    FROM SUIVI
    UNION
    ...
    ORDER BY dateOperation
    Donc ça m'importe bien les valeurs que je désire, mais en plus il met un enregistrement pour les SUIVI qui n'ont toutes les dates... Par exemple si j'ai un SUIVI qui correspond à une carte qui a été uniquement demandée et reçue (donc les autres dates sont nulles), il me sélectionne 6 Suivis dont 4 ont une dateOpération nulle. Je ne veux pas sélectionner ceux-ci.
    Pour y remédier, j'ai essayé de rajouter des WHERE dateOpération <> NULL après chaque FROM mais le problème, c'est qu'il ne me sélectionne aucun enregistrement.

    Avez-vous une idée de la façon dontje pourrais m'y prendre ?

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Il va falloir faire autant de requêtes d'insertion qu'il y a de type d'opération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO second_suivi (dateOperation, Operation, IDCarte)
    SELECT DateDemande, 'Demande', IDCarte
    FROM premier_suivi
    Pour les suivantes, remplacer le nom de la colonne date à importer ainsi que le libellé de l'opération.

    Au lieu d'un libellé d'opération, vous devrier externaliser ces types et mettre ici une clé étrangère faisant référence à l'identifiant du type d'opération.

  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
    Deux choses effectivement à améliorer.
    NULL n'est pas une valeur définie, on ne peut pas la comparer directement à une colonne.
    C'est pour cela qu'on utilise la syntaxe <macolonne> IS NULL ou <macolonne> IS NOT NULL.

    Le second point, vous pouvez utiliser UNION ALL au lieu de UNION.
    Ce dernier effectue un DISTINCT sur toutes vos données, et rien que par l'ajout des noms d'opérations en dur combiné à votre ID, vous savez que vos données sont déjà uniques.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT DateDemande AS dateOperation,
           'Demande' AS Opération,
           IDCarte
      FROM SUIVI
     WHERE DateDemande IS NOT NULL
     UNION ALL
    SELECT DateReception AS dateOperation,
           'Reception' AS Opération,
           IDCarte
    ...
    Edit : Tout-à-fait d'accord avec Cinéphil sur l'utilisation d'une table qui contiendrait les types d'opération.

    Certains SGBD (Oracle 11gR1+, SQL Server 2005+) implémentent l'opérateur UNPIVOT qui effectue plus ou moins cette tâche.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 97
    Points : 52
    Points
    52
    Par défaut
    Merci de cette réponse rapide

    Pour l'opération, c'est exactement ce que je fait mais je voulais simplifier le problème

    En vérité, à la place du 'Demande' AS Opération je fait des '1' AS IDOpération, etc...

    Sinon pour la proposition de Waldar, je fais bien les requêtes comme tu me l'a conseillé, avec le IS NOT NULL et le UNION ALL mais ça me réaffiche tous les enregistrements, même ceux qui ont une date nulle...

    Je vous montre ma requête (elle est assez conséquente ):

    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
    SELECT DateDemande AS dateOperation, IDCPS AS IDCarte, IDUser AS IDUtilisateur, IDUtilisateur AS IDAgent, '6' AS IDOperation 
    FROM SUIVI.FIC 
    WHERE dateDemande IS NOT NULL 
    UNION ALL
    SELECT DateReception AS dateOperation, IDCPS AS IDCarte, IDUser AS IDUtilisateur, IDUtilisateur AS IDAgent, '5' AS IDOperation 
    FROM SUIVI.FIC 
    WHERE DateReception IS NOT NULL 
    UNION ALL 
    SELECT DateDistribution AS dateOperation, IDCPS AS IDCarte, IDUser AS IDUtilisateur, IDUtilisateur AS IDAgent, '1' AS IDOperation 
    FROM SUIVI.FIC 
    WHERE dateDistribution IS NOT NULL 
    UNION ALL 
    SELECT DatePerte AS dateOperation, IDCPS AS IDCarte, IDUser AS IDUtilisateur, IDUtilisateur AS IDAgent, '2' AS IDOperation 
    FROM SUIVI.FIC 
    WHERE datePerte IS NOT NULL 
    UNION ALL 
    SELECT DateFinAttribution AS dateOperation, IDCPS AS IDCarte, IDUser AS IDUtilisateur, IDUtilisateur AS IDAgent, '7' AS IDOperation 
    FROM SUIVI.FIC 
    WHERE dateFinAttribution IS NOT NULL 
    UNION ALL 
    SELECT DateRestitution AS dateOperation, IDCPS AS IDCarte, IDUser AS IDUtilisateur, IDUtilisateur AS IDAgent, '4' AS IDOperation 
    FROM SUIVI.FIC 
    WHERE dateRestitution IS NOT NULL 
    ORDER BY dateOperation
    Les rubriques avant les 'AS' sont les rubriques du premier SUIVI et celles après le 'AS' sont celles du second.

    Donc comment faire pour que les enregistrements ayant une date nulle ne soient plus sélectionnés ?

  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
    Citation Envoyé par Aenur56 Voir le message
    Sinon pour la proposition de Waldar, je fais bien les requêtes comme tu me l'a conseillé, avec le IS NOT NULL et le UNION ALL mais ça me réaffiche tous les enregistrements, même ceux qui ont une date nulle...
    Non impossible, vous avez du faire une erreur quelque part.
    Pour vos IDOperation, je vous conseille un nombre plutôt qu'un littéral (sans les quotes).

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 97
    Points : 52
    Points
    52
    Par défaut
    Pourtant j'ai bien utilisé la requête que j'ai inscrit au dessus.
    Je suis sur un logiciel que je développe avec windev et qui utilise une base de données HyperFileSQL. Dans le centre de contrôle HFSQL, il y a possibilité d'exécuter des requêtes de sélection sur les tables, c'est là que j'inscrit ma requête.

    Une fois exécutée, le tableau-résultat contient TOUS les enregistrements, même avec une dateOpération nulle. Je les ai trié par IDCarte et il ya bien 6 enregistrement par IDCarte.

    Donc à moins que ce ne soit HyperFileSQL qui bug, je ne vois pas où est mon erreur.

    [EDIT] J'ai essayé en remplaçant les "IS NOT NULL" par des " <> '' " et là ça fonctionne ! Apparament le vide n'est pas considéré comme null chez HFSQL...
    Désolé d'avoir remis en doute ton jugement

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Aenur56 Voir le message
    [EDIT] J'ai essayé en remplaçant les "IS NOT NULL" par des " <> '' " et là ça fonctionne ! Apparament le vide n'est pas considéré comme null chez HFSQL...
    Ce n'est pas propre à HFSQL !
    Une chaîne vide n'est pas NULL !
    NULL n'est égal à rien, pas même à NULL !
    C'est pour ça qu'on utilise l'opérateur spécial IS (NOT) NULL et non pas = NULL.

    Si une valeur est vraiment NULL, normalement, l'interface doit afficher NULL, pas une zone blanche. La zone blanche indique en principe une chaîne vide.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 97
    Points : 52
    Points
    52
    Par défaut
    A d'accord je ne savais pas... J'ai jamais été bon pour comprends ces histoires de NULL, IS NOT NUL, etc...
    En plus je suis un peu bête parce que des fois avec certaines requêtes il me le mettait le NULL dans les champs donc j'aurais dû faire le rapprochement...

    En tout cas, merci beaucoup pour l'info, je m'en rappelerai la prochaine fois

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    La dernière fois que j'ai eu affaire à cette ### de windev, avec hyperfile, il etait impossible de faire la différence entre null et chaine vide''.
    La gestion du null n'avait rien à voir avec un SGBD normalement constitué.
    De mémoire les entiers nullable avait comme valeur 0.Donc sur un champ nullable il etait impossible de faire la différence essentielle entre 0 et null.

    Bon c'etait il y a 5 ou 6 ans ils ont pu faire des progrès.
    A+
    Soazig

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

Discussions similaires

  1. requete sql pour sommer des colonnes
    Par debutsas dans le forum SAS Base
    Réponses: 109
    Dernier message: 22/04/2011, 12h26
  2. Réponses: 8
    Dernier message: 03/04/2011, 01h45
  3. Requête SQL pour décaler des lignes
    Par dekalima dans le forum Requêtes
    Réponses: 9
    Dernier message: 25/01/2011, 11h06
  4. [MySQL] Requête SQL pour afficher des "Related Items"
    Par neoweiter dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 15/07/2009, 14h15
  5. [MySQL] Problème de requête SQL pour calculer des stats
    Par k2006 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 21/05/2009, 18h23

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