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

Développement SQL Server Discussion :

[2005] MIN + COUNT & JOIN


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut [2005] MIN + COUNT & JOIN
    Bonjour.

    J'aimerais en joignant deux tables, obtenir le nombre de lignes uniques que j'ai dans ma première table et la valeur minimale d'un champ dans la seconde table.
    Je pense que ce n'est pas faisable sans sous query mais j'ai un léger doute que vous pouvez peut-être dissiper.

    Disons :
    Table1 : a INT, b INT, c BIT (PK : a, b)
    Table2 : i INT, a INT, b INT, d DATETIME (PK : i FK : a, b).

    J'aimerais obtenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT
    COUNT(DISTINCT T1.a, T2.b) AS CntT1 -- non supporté
    , MIN(T2.d) AS MinD
    FROM Table1 AS T1
    INNER JOIN Table2 AS T2 ON (
    T2.a = T1.a
    AND
    T2.b = T1.b
    )
    Est-ce possible sans sous-query ? Comment feriez-vous ?

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour

    En fait je ne vois pas l’intérêt d'une jointure ici puisque vous n'avez ps besoin de mettre en relation les données des deux tables.
    Vous voulez le nombre de ligne dans une table d'une part,
    Le min d'une colonne d'une autre table d'autre part

    Je ferai quelque chose comme ceci :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT 
        (SELECT COUNT(*) FROM Table1) AS CntT1,
        (SELECT MIN(d) FROM Table2) AS MinD

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour

    En fait je ne vois pas l’intérêt d'une jointure ici puisque vous n'avez ps besoin de mettre en relation les données des deux tables.
    C'est juste un exemple.
    Je le modifie d'un poil pour clarifier que je ne suis pas passer à côté de l'évident

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT
    COUNT(DISTINCT T1.a, T2.b) AS CntT1 -- non supporté
    , MIN(T2.d) AS MinD
    FROM Table1 AS T1
    INNER JOIN Table2 AS T2 ON (
    T2.a = T1.a
    AND
    T2.b = T1.b
    )
    WHERE T1.c = 1

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    ok, je me disais aussi que j'avais du passer a coté de quelque chose

    reprenons :

    Je vois bien une solution bidouille à partir de votre requête initiale :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT
    COUNT(DISTINCT STR(T1.a) + '|' +  STR(T2.b)) AS CntT1 
    , MIN(T2.d) AS MinD
    FROM Table1 AS T1
    INNER JOIN Table2 AS T2 ON (
    T2.a = T1.a
    AND
    T2.b = T1.b
    )
    WHERE T1.c = 1

    Mais personnellement je ne suis pas un grand adepte de ce genre de bricolage...

    Sinon il reste possible de modifier la requête que je vous ai donnée pour y ajouter le filtre (sur chacune des deux sous requêtes, avec une jointure ou un EXISTS sur la deuxième...)


    Pour ma part, je testerais les performances d'une requête de ce type :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT
        COUNT(*) AS CntT1
        , MIN(T.mini) AS MinD
    FROM Table1 AS T1
    CROSS APPLY (
        SELECT MIN(d) AS mini
        FROM Table2 T2
        WHERE T2.a = T1.a
            AND T2.b = T1.b
    )T
    WHERE T1.c = 1

    Qui, selon vos données/index/sélectivité du filtre/... , pourra vous donner de bons résultats. Il faudra surtout un index sur Table2(a,b,d)

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    J'étais arrivé à cette solution (d'ailleurs, j'avais aussi songé puis écarté l'idée d'une concaténation) mais puisque de toute évidence avec une simple jointure toutes les données nécessaires à l'opération que je souhaite faire sont déjà là, je me disais qu'il y avait peut-être une écriture pour le faire.

    Surtout qu'il existe des éléments de language (ou en tout cas des procédures) non documentés, on ne sait jamais.

Discussions similaires

  1. [MySQL] Multiplier/additionner des COUNT en JOIN LEFT?
    Par kfa1983 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 29/03/2011, 16h35
  2. Multiple count et join
    Par levalp dans le forum Requêtes
    Réponses: 11
    Dernier message: 22/06/2010, 15h48
  3. count et join de deux tables
    Par crazyvirus dans le forum Requêtes
    Réponses: 1
    Dernier message: 12/03/2010, 05h52
  4. [SSRS][2005][MDX] Left outer join en MDX
    Par geof dans le forum SSRS
    Réponses: 7
    Dernier message: 20/06/2008, 12h15
  5. multiples COUNT et JOIN
    Par Ryle dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/08/2004, 08h26

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