web-dev-qa-db-ja.com

customer_nameが異なる複数のcustomer_idによって共有されているアドレスを検索する

複数のcustomer_IDが関連付けられているアドレスのリストを返し、同じcustomer_nameを持つcustomer_IDを除外して、アドレスが繰り返される回数を返す必要があります。

データは次のようになります。

CUSTOMER_ID   |   CUSTOMER_NAME   |   ADDRESS           | MEMBER_SINCE
----------------------------------------------------------------------
A1000         |      John Doe     |    123 West Lane    |  2/23/2005

A1001         |      John Doe     |    123 West Lane    |  9/30/2005

A1002         |      Tom White    |    456 East Street  |  5/7/2006

A1003         |      Frank Smith  |    123 West Lane    |  12/12/2006

A1004         |      Lisa Simpson |    456 East Street  |  7/19/2007

A1005         |      Clark Kent   |    700 North Ave.   |  2/23/2008

A1006         |      Darth Vader  |    123 West Lane    |  9/29/2008

A1007         |      John Doe     |    456 East Street  |  5/23/2007

A1008         |      Bart Star    |    456 East Street  |  4/19/2006

結果セットを次のようにしたいと思います。

CUSTOMER_ID   |   CUSTOMER_NAME   |   ADDRESS           | MEMBER_SINCE| COUNT
--------------------------------------------------------------------------------
A1000         |      John Doe     |    123 West Lane    |  2/23/2005  |  3

A1002         |      Tom White    |    456 East Street  |  5/7/2006   |  4

A1003         |      Frank Smith  |    123 West Lane    |  12/12/2006 |  3

A1004         |      Lisa Simpson |    456 East Street  |  7/19/2007  |  4

A1006         |      Darth Vader  |    123 West Lane    |  9/29/2008  |  3

A1007         |      John Doe     |    456 East Street  |  5/23/2007  |  4

A1008         |      Bart Star    |    456 East Street  |  4/19/2006   |  4

結果には、CUSTOMER_IDが異なっていても、別の行と同じADDRESSおよびCUSTOMER_NAMEを持つ行を無視しながら、CUSTOMER_ID、CUSTOMER_NAMES、ADDRESSES、MEMBER_SINCE、およびアドレスを共有する個別のCUSTOMER_IDのCOUNTが表示されます。複数のCUSTOMER_IDを持たないADDRESSESも除外されます。

CUSTOMER_NAMEとADDRESSは同じであり、重複している必要があるため、結果にはCUSTOMER_ID A1001が含まれていません。また、そのアドレスを持つ他の顧客がいないため、A1005は含まれていません。

これが始まりです:

SELECT
  CUSTOMER_ID as CUSTOMER_ID,
  "CUSTOMER_NAME" as CUSTOMER_NAME,
  "ADDRESS",
  "MEMBER_SINCE",
  count(CUSTOMER_ID) as COUNTER
FROM CUSTOMER_TABLE
  group by ADDRESS_ID, CUSTOMER_ID, CUSTOMER_NAME
  having 
  count(CUSTOMER_ID)>1 
  order by CUSTOMER_ID; 

しかし、重複したCUSTOMER_NAMESをなんとか取り出すことができません。

これは私の最初の投稿であり、私にとっては非常に遅いので、質問を正しく投稿しなかった場合は事前に謝罪します。

AR

1
AR99

上記のクエリは、ADDRESSCUSTOMER_ID、およびCUSTOMER_NAMEでグループ化されます。 CUSTOMER_IDは一意であるため、出力にはCUSTOMER_IDごとに1行が含まれます。

このクエリは正しい結果をもたらします:

SELECT
    CUSTOMER_ID = MIN(ct.CUSTOMER_ID)
    , ct.CUSTOMER_NAME
    , ct. ADDRESS
    , MEMBER_SINCE = MIN(ct.MEMBER_SINCE)
    , cnt.c
FROM CUSTOMER_TABLE ct
INNER JOIN (
    SELECT ADDRESS, COUNT(DISTINCT CUSTOMER_NAME) as c
    FROM CUSTOMER_TABLE 
    GROUP BY ADDRESS 
    HAVING COUNT(ADDRESS) > 1
) as cnt ON cnt.ADDRESS = ct.ADDRESS
GROUP BY ct.ADDRESS, ct.CUSTOMER_NAME, cnt.c
ORDER BY MIN(ct.CUSTOMER_ID); 

ここでは、ADDRESS andCUSTOMER_NAMEonly and pick one of theCUSTOMER_ID andMEMBER_SINCE. I choose theMIN(value) `でグループ化する必要があります。

同様のアドレスを持つ個別のCUSTOMER_IDのカウントも必要なため、サブクエリに追加されました。

結果:

CUSTOMER_ID | CUSTOMER_NAME | ADDRESS           | MEMBER_SINCE              | COUNT
A1000       | John Doe      | 123 West Lane     | 2005-02-23 00:00:00.000   | 3
A1002       | Tom White     | 456 East Street   | 2006-05-07 00:00:00.000   | 4
A1003       | Frank Smith   | 123 West Lane     | 2006-12-12 00:00:00.000   | 3
A1004       | Lisa Simpson  | 456 East Street   | 2007-07-19 00:00:00.000   | 4
A1006       | Darth Vader   | 123 West Lane     | 2008-09-29 00:00:00.000   | 3
A1007       | John Doe      | 456 East Street   | 2007-05-23 00:00:00.000   | 4
A1008       | Bart Star     | 456 East Street   | 2006-04-19 00:00:00.000   | 4

SAP-Hanaにアクセスできないことに注意してください。ただし、これはかなり標準的なSQLのようであり、クエリを使用するとほとんどのRDBMSで機能するはずです。

1