2011-07-19 3 views
0

J'ai une table MYTABLE. Ceci contient des clients et des emplacements.Instruction SQL groupée imbriquée

Quelle instruction Sql puis-je utiliser pour savoir quels clients ont plus de 1 emplacement et uniquement afficher sur ceux avec plus de 1 emplacement? Un emplacement peut être utilisé pour plusieurs clients différents.

Cela n'a pas fonctionné: cela ne montre le nombre de occurances

SELECT CU _NO, LOC_NO, COUNT(LOC_NO) AS NUMBEROCC 
FROM MYTABLE 
GROUP BY LOC_NO 
HAVING (COUNT(LOC_NO)>1) 

Le tableau a plus d'une ligne de la même client (désolé c'était important)

Répondre

1
SELECT m.CU_NO 
    , m.LOC_NO 
    , grp.NUMBEROCC 
FROM MYTABLE AS m 
    JOIN 
    (SELECT CU_NO 
      , COUNT(DISTINCT LOC_NO) AS NUMBEROCC 
     FROM MYTABLE 
     GROUP BY CU_NO 
     HAVING COUNT(DISTINCT LOC_NO) > 1 
    ) AS grp 
    ON grp.CU_NO = m.CU_NO 
ORDER BY m.CU_NO 
+0

Merci Ypercube et Petar – icecurtain

2

Vous devez inclure tous champs non agrégés de votre clause SELECT dans la clause GROUP BY, vous devez donc supprimer le champ et le groupe LOC par CU_NO.

SELECT CU_NO, COUNT(LOC_NO) AS NUMBEROCC 
FROM MYTABLE 
GROUP BY CU_NO 
HAVING (COUNT(LOC_NO)>1) 
1

Vous devez utiliser une fonction de fenêtre si vous voulez obtenir tous les emplacements de tous les clients avec plus d'un emplacement:

SELECT t.CU_NO, t.LOC_NO, t.NUMBEROCC 
FROM (
    SELECT CU_NO, LOC_NO, COUNT(LOC_NO) OVER (PARTITION BY CU_NO) AS NUMBEROCC 
    FROM MYTABLE 
) AS t 
WHERE t.NUMBEROCC > 1 

Si vous ne se soucient pas de tous les lieux, mais juste le ids des clients, vous pouvez utiliser simple groupe par clause:

SELECT CU_NO 
FROM MYTABLE 
GROUP BY CU_NO 
HAVING COUNT(DISTINCT LOC_NO) > 1 

Mais dans les deux cas, vous voulez regrouper par CU_NO, non par LOC_NO!


application serveur SQL de fonctions de fenêtre n'a pas (encore!) Inclus COUNT(DISTINCT x) OVER(PARTITION BY x). Donc, cela soulève erreur:

SELECT t.CU_NO, t.LOC_NO, t.NUMBEROCC 
FROM (
    SELECT CU_NO, LOC_NO 
     , COUNT(DISTINCT LOC_NO) OVER (PARTITION BY CU_NO) AS NUMBEROCC 
    FROM MYTABLE 
) AS t 
WHERE t.NUMBEROCC > 1 

La solution consiste à utiliser DENSE_RANK() OVER() et MAX() OVER() avec un niveau de requête supplémentaire:

SELECT x.CU_NO, x.LOC_NO, x.NUMBEROCC 
FROM (
    SELECT t.CU_NO, t.LOC_NO 
     , MAX(DR) OVER(PARTITION BY CU_NO) AS NUMBEROCC 
    FROM (
     SELECT CU_NO, LOC_NO 
      , DENSE_RANK() OVER (PARTITION BY CU_NO ORDER BY LOC_NO) AS DR 
     FROM MYTABLE 
    ) AS t 
) AS x 
WHERE x.NUMBEROCC > 1 
+0

Le problème de votre première déclaration montre la CU_NO_ LOC_NO suivie par le nombre total de tous les clients avec cet emplacement. la seconde montre des clients qui n'ont qu'un seul emplacement. C'est ma faute car la table contient le même client plus d'une fois. (J'ai simplifié mais cela a causé de la confusion) – icecurtain

+0

es-tu sûr ... que ça ne peut pas être. C'est bon d'avoir le même client plus d'une fois, s'il a plus d'un endroit. –

+0

J'ai modifié l'agrégat pour être 'COUNT (DISTINCT LOC_NO)'. De cette façon, même si vous avez une ligne dupliquée (même custome avec le même emplacement deux fois), elle sera correcte. –

Questions connexes