2011-07-19 16 views
0

私はテーブルMYTABLEを持っています。 これには顧客と場所が含まれます。ネストされたGROUP SQL文

1つ以上の顧客が1つ以上の場所を持っていることを確認するために使用できる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句の非集約フィールドを削除する必要があるため、フィールドとグループを削除して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 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を示し総数が続く:

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()を使用することですその場所にいるすべての顧客2番目の場所には1つの場所しかない顧客が表示されます。そのテーブルの私のせいで、同じ顧客が2度以上含まれています。(私は簡素化されましたが、これが混乱の原因となりました) – icecurtain

+0

あなたは確かですか...それはできません。複数の場所がある場合は、同じ顧客を複数回持つことは大丈夫です。 –

+0

集計を 'COUNT(DISTINCT LOC_NO)'に変更しました。このようにしても、重複した行(同じ場所の2人目の同じカスタム)が正しいでしょう。 –

関連する問題