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

C# Discussion :

jonction/fusion de deux résultats de requête [Débutant]


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2012
    Messages : 5
    Par défaut jonction/fusion de deux résultats de requête
    Bonjour,

    Je suis débutant en c# (et même en programmation) donc mes excuses pour les erreurs et incohérances que vous pourrez voir.

    Je souhaite lier le résultat de deux requêtes sur deux bases de données différentes en clair.
    Je fais une requête 1 sur la base de données 1 et une requête 2 sur la base de données 2.
    Le résultat de ma requête 1 donne ça :
    Date Nombre d'occurance
    10/01/2012 52
    11/01/2012 62
    12/01/2012 35
    13/01/2012 18

    Le résultat de ma requête 2 donne ça :
    Date Colonne 2
    10/01/2012 a9
    11/01/2012 9f
    12/01/2012 5m
    13/01/2012 69


    Je souhaiterais donc faire une jonction via la colonne Date

    Je précise qu’il m’est impossible de faire une jonction via sql (seul les résultats des requêtes peuvent être lié puisque j’utilise des « group by » pour avoir des dates pouvant être jointe)

    Voici mon code :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    sCmdSelect = new SqlCommand(Requete1, sConnection1); //Création de commande SQL avec ma requête1 sur ma BDD
    sDataAdapter = new SqlDataAdapter(sCmdSelect); //Création de mon DataAdapter avec ma commande SQL
    sCmdSelect.CommandTimeout = 800; //Timeout de ma commande SQL
    dsREQ1.Reset(); //
    dsREQ1.Clear(); //Nettoyage de mon DataSet
    dsREQ1.Tables.Add("1"); //Ajout d'une table "1" à mon DataSet
    sDataAdapter.Fill(dsREQ1.Tables["1"]); //Ecriture du résultat de ma requête dans la table "1" de mon DataSet
     
    sCmdSelect = new SqlCommand(Requete2, sConnection2); //Création de commande SQL avec ma requête2 sur ma BDD
    sDataAdapter = new SqlDataAdapter(sCmdSelect); //Création de mon DataAdapter avec ma commande SQL
    sCmdSelect.CommandTimeout = 800; //Timeout de ma commande SQL
    sDataAdapter.Fill(dsREQ1.Tables["1"]); //Ecriture du résultat de ma requête2 dans la table "1" de mon DataSet
     
    dataGridView1.DataSource = dsREQ1.Tables["1"];

    Voici le résultat obtenu :
    Date Colonne 1 Colonne 2
    10/01/2012 52
    11/01/2012 62
    12/01/2012 35
    13/01/2012 18
    10/01/2012 a9
    11/01/2012 9f
    12/01/2012 5m
    13/01/2012 69
    Voici le résultat que je souhaiterais obtenir:
    Date Colonne 1 Colonne 2
    10/01/2012 52 a9
    11/01/2012 62 9f
    12/01/2012 35 5m
    13/01/2012 18 69

    J’ai essayé plusieurs méthode (ex : Merge, relation, etc…) mais je n’y arrive pas ou n’obtiens pas le résultat souhaité.
    Si vous avez une idée ou une méthode je preneur (ça fait plusieurs jours que je me creuse la tête).
    Merci d’avance pour vos remarques et/ou éclairement.
    Adrien

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 200
    Par défaut
    Citation Envoyé par Adrien28 Voir le message
    Je précise qu’il m’est impossible de faire une jonction via sql
    donne nous les 2 requêtes qu'on puisse en juger nous même, car il n'y a pas grand chose qui n'est pas faisable en sql directement
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre à l'essai
    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2012
    Messages : 5
    Par défaut
    Tout d'abord merci de l'intérêt porté à mon problème
    En fait, le souci ne vient pas des requêtes mais des deux tables sur lesquelles je fais les requêtes. Je m'explique:
    En simplifiant, ma table 1 c'est une colonne "Date" au format jj/mm/aaaa hh:mm:ss et une colonne "A" avec des données lambda
    ma table 2 c'est une colonne "Date" (également) au format jj/mm/aaaa hh:mm:ss et une colonne "B'" avec des données lambda (aussi)
    Mais ces dates n'ont aucune correspondance entre la table 1 et 2 donc si je fais une jonction via SQL ça me fait autant de lignes de ma table 1 x autant de lignes de ma table 2 vu le nombre de ligne dans chaque table c'est ingérable.
    L'idéalement (je pense) serait soit de faire une jonction avec le résultat de mes requêtes (si c'est possible?) soit une jonction de mes datatablesen C#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //Requête 1:
    select substring(convert(char,Date,21),1,10) as [Date],
    sum(case when A is not null then 1 else 0 end) [A]
    from table_1 where Date>='@DEBUT' and Date<='@FIN'
    group by substring(convert(char,Date,21),1,10) 
    order by substring(convert(char,Date,21),1,10) asc
    //Requête 2:
    select substring(convert(char,Date,21),1,10) as [Date],
    sum(case when B is not null then 1 else 0 end) [B]
    from table_2 where Date>='@DEBUT' and Date<='@FIN'
    group by substring(convert(char,Date,21),1,10) 
    order by substring(convert(char,Date,21),1,10) asc
    Merci d'avance

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 200
    Par défaut
    une date n'a pas de format tel jj/mm/aaaa c'est un format binaire, seule sa représentation en string a un format

    avec un inner join ca ne multiplie pas les lignes et ca fait le résultat que tu souhaites

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select t1.d, t1.lambda1, t2.lambda2 from t1 inner join t2 on t1.d = t2.d
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre à l'essai
    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2012
    Messages : 5
    Par défaut
    Merci pour la réponse, je vais faire l'essai.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2012
    Messages : 5
    Par défaut
    J'ai essayé ça me donne bien la forme du tableau final voulu mes les données sont fausses, il semblerait que j'ai bien une multiplication des lignes.
    Les dates dans la table 1 ne sont pas du tout les mêmes que dans la table deux. Elles ont les mêmes formats, mais les valeurs sont totalement différentes.
    Le format de mes dates dans les table est datetime (aaaa-mm-jj hh:mm:ss)
    C'est seulement après l'exécution des requêtes que je peux avoir des dates identiques (grâce à "group by") puisque je regroupe les données jour par jour et converti les dates en char (aaaa-mm-jj).
    Voici la requête que j’ai exécutée avec l’inner join :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select substring(convert(char,date,21),1,10) as [Date],
    sum(case when A is not null then 1 else 0 end) [A],
    sum(case when B is not null then 1 else 0 end) [B]
    from table_1 inner join table_2 on substring(convert(char,table_1.date,21),1,10) = substring(convert(char, table_2.date,21),1,10) 
    where date_lecture>='@debut' and date_lecture<='@fin'
    group by substring(convert(char,date,21),1,10) 
    order by substring(convert(char,date,21),1,10) asc

  7. #7
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 200
    Par défaut
    j'avais pas vu que tu avais donné la requete précédemment, j'aurais pu te mettre la bonne requête directement plutot que l'exemple générique, car l'astuce n'est pas forcément évidente



    ensuite ta requete devrait plutot être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT tmp1.[date], A, B 
        FROM 
             (select substring(...) as [date], sum() [A] from t1 where (...) group by substring(...)) tmp1
           INNER JOIN          
             (select substring(...) as [date], sum() [B] from t2 where (...) group by substring(...)) tmp2 
           ON tmp1.[Date] = tmp1.[Date]
    ORDER BY tmp1.[Date]
    sinon y a ca me parait louche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where date_lecture>='@debut' and date_lecture<='@fin'
    les paramètres seront interprétés comme des string et non remplacés par leurs valeurs =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where date_lecture>=@debut and  date_lecture<=@fin
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre à l'essai
    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2012
    Messages : 5
    Par défaut
    Ça à l'air de très bien marcher, j'avais peur que la jonction ralentisse l'exécution de la requête mais pas du tout.
    Un grand merci pour ton aide, ça m'enlève un sacré poids.
    Merci bon week-end

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

Discussions similaires

  1. [DML]Fusion de deux requêtes full Outer join colonne null
    Par peuplier dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/01/2009, 15h22
  2. [PEAR][DB][DB_DataObjet] Lire deux fois un résultat de requête
    Par Garra dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 05/09/2008, 15h13
  3. Réponses: 18
    Dernier message: 28/04/2008, 17h57
  4. Fusion de deux requêtes pour tri partiel
    Par zebiloute dans le forum Langage SQL
    Réponses: 6
    Dernier message: 04/12/2007, 11h29
  5. Fusion de deux requètes
    Par florent dans le forum Langage SQL
    Réponses: 4
    Dernier message: 22/05/2007, 19h52

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