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
Merci Ypercube et Petar – icecurtain