2011-07-19 158 views
0

我有一個表MYTABLE。 這包含顧客和地點。嵌套組SQL語句

我可以使用什麼Sql語句來找出客戶有多於一個地點 ,並且只能顯示多於一個地點的客戶?一個位置可以用於幾個不同的客戶。

這不起作用:這隻能表明Occurances

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

表具有相同的客戶超過一排的(抱歉,這是很重要的)

回答

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

謝謝Ypercube和Petar – icecurtain

2

的數量,您需要包括所有GROUP BY子句中的SELECT子句的非聚合字段,因此必須刪除LOC字段和組CU_NO

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

,如果你想獲得的所有客戶的所有位置與一個以上的位置,您應該使用一個窗口函數:

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 
+0

問題的第一條語句顯示CU_NO_ LOC_NO其次總數所有擁有該位置的客戶。第二個顯示只有一個位置的顧客。它是我的錯,因爲桌子不止一次包含同一個客戶(我簡化了,但是這造成了混淆) – icecurtain

+0

你確定...不可能。如果他擁有多個位置,可以不止一次地擁有同一個客戶。 –

+0

我已將聚合修改爲COUNT(DISTINCT LOC_NO)'。這樣,即使你有重複行(相同的位置相同的custome兩次)它將是正確的 –