2016-10-06 3 views
0

私はかなり探していて、必要なものに合った解決策を見つけることができないようです。名前が重複している顧客の詳細を表示するクエリを作成するにはどうすればよいですか?

私は多くの顧客を持つテーブルを持っていますが、問題はこのテーブルに多数の重複があることです。

私は、レコードが重複している顧客と同じ名前のテーブルに含まれる顧客の数を見ることができましたが、これを分割してすべての情報を表示して確認できます私たちがそれらを見上げるとき、顧客が正しいものであること。

SELECT COUNT(NAME), NAME 
    FROM DEV.ALL_CUSTOMER 
    GROUP BY NAME 
    HAVING COUNT(NAME) > 1; 

次のように表示される結果が得られます:

SELECT COUNT(NAME), NAME, TOTAL_PURCHASED, ADDRESS, CITY, STATE_PROV, POSTAL_CODE, COUNTRY, HOME_PHONE, WORK_PHONE, WORK_EXT, OTHER_PHONE, EMAIL_ADDRESS 
    FROM DEV.ALL_CUSTOMER 
    GROUP BY NAME, TOTAL_PURCHASED, ADDRESS, CITY, STATE_PROV, POSTAL_CODE, COUNTRY, HOME_PHONE, WORK_PHONE, WORK_EXT, OTHER_PHONE, EMAIL_ADDRESS 
    HAVING COUNT(NAME) > 1; 

COUNT(NAME) |  NAME 
------------|------------------- 
    3  | Smith, John 
    2  | Doe, Jane 
    2  | Doe, Joe 
    2  | Smith, Jane 

は、私は、私は必要な情報のすべてのフィールドに追加を

私はこのコードを使用していました

これでもグループ化されており、各レコードの情報は表示されません:

COUNT(NAME) | NAME  | TOTAL_PURCHASED | ADDRESS | CITY ... 
------------|-------------|-----------------|---------|------- .. 
    3  | Smith, John |  0  | (null) | (null) .. 
    2  | Doe, Jane |  0  | (null) | (null) .. 
    2  | Doe, Joe |  0  | (null) | (null) .. 

しかし、5人の「John Smith」顧客のうちの1人が購入したことが分かりました。

代わりに、私は次のように出てくる結果を希望:

NAME  | TOTAL_PURCHASED | ADDRESS  | CITY ... 
------------|-----------------|---------------|------- .. 
Smith, John |  250  | 123 Fake St. | (null) .. 
Smith, John |  0  | (null)  | Oshawa .. 
Smith, John |  300  | (null)  | Toronto . 
Doe, Jane |  0  | (null)  | (null) .. 
Doe, Jane |  300  | 456 Fake St. | Toronto . 
Doe, Joe |  11235  | (null)  | (null) .. 
Doe, Joe |  0  | (null)  | (null) .. 
+0

おそらく私は何かが不足していますが、あなたの望む結果が "select * from all_customers order by name"ではないでしょうか?たぶん、 '(あなたのグループによる/あなたのグループの名前)'で ''。 –

+0

私は 'SELECT [FIELDS] FROM DEV.ALL_CUSTOMER HAVING COUNT(NAME)> 1;'を試しましたが、エラーです。 – WolfieeifloW

答えて

3

使用ウィンドウ機能:これはあなたのNAMEに複製された行を与える

SELECT c.* 
FROM (SELECT c.*, COUNT(*) OVER (PARTITION BY NAME) as cnt 
     FROM DEV.ALL_CUSTOMER c 
    ) c 
WHERE cnt > 1 
ORDER BY NAME; 

+0

2番目の 'SELECT'ステートメントに投稿したフィールドだけが必要です。あなたのコードの両方の選択項目で 'c。*'をそれらの特定のフィールドに置き換えるだけですか?同様に、次のようにしてください: 'DEVICE.ALL_CUSTOMER c)cどこでcnt> 1 ORDER BY NAME;より' CUST @ NAME、(名前別に名前をつけて)を選択して[特殊フィールド]を選択してください。 ' – WolfieeifloW

+1

@WolfieeifloWはい、それは正しいでしょう。 – SlimsGhost

+1

@ WolfieeifloW。 。 。必要なフィールドを外側の 'select'に置くことができます。 –

関連する問題