,如果你想獲得的所有客戶的所有位置與一個以上的位置,您應該使用一個窗口函數:
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
如果你不關心的所有位置,但只是客戶ID,那麼你可以通過子句中使用單羣:
SELECT CU_NO
FROM MYTABLE
GROUP BY CU_NO
HAVING COUNT(DISTINCT LOC_NO) > 1
但您CU_NO想組這兩種情況下,不LOC_NO!
窗口函數的SQL Server實現還沒有(還)!COUNT(DISTINCT x) OVER(PARTITION BY x)
。所以,這會引發錯誤:
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
解決方法是使用DENSE_RANK() OVER()
和MAX() OVER()
有一個額外的查詢級別:
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
謝謝Ypercube和Petar – icecurtain