count> 1のレコードを見つけるためのSQLクエリ


176

というテーブルがありますPAYMENT。このテーブルには、ユーザーID、アカウント番号、郵便番号、日付があります。同じアカウント番号で1日に複数回の支払いがあるすべてのユーザーのすべてのレコードを検索したいと思います。

更新:さらに、郵便番号が異なるレコードのみをカウントするフィルターがあるはずです。

これはテーブルがどのように見えるかです:

| user_id | account_no | zip | 日付|
| 1 | 123 | 55555 | 12月12日|
| 1 | 123 | 66666 | 12月12日|
| 1 | 123 | 55555 | 2009年12月13日|
| 2 | 456 | 77777 | 2009年12月14日|
| 2 | 456 | 77777 | 2009年12月14日|
| 2 | 789 | 77777 | 2009年12月14日|
| 2 | 789 | 77777 | 2009年12月14日|

結果は次のようになります。

| user_id | カウント|
| 1 | 2 |

これをSQLクエリでどのように表現しますか?私は自己参加を考えていましたが、何らかの理由で私のカウントが間違っています。

回答:


344

使用HAVING行を一意にする分野では句とGROUPを

以下が見つかります

同じアカウント番号で1日に複数回の支払いを受けるすべてのユーザー

SELECT 
 user_id ,
 COUNT(*) count
FROM 
 PAYMENT
GROUP BY
 account,
 user_id ,
 date
Having
COUNT(*) > 1

更新 個別のZIPを持つもののみを含める場合は、個別のセットを最初に取得してから、HAVING / GROUP BYを実行します。

 SELECT 
    user_id,
    account_no , 
    date,
        COUNT(*)
 FROM
    (SELECT DISTINCT
            user_id,
            account_no , 
            zip, 
            date
         FROM
            payment 

        ) 
        payment
 GROUP BY

    user_id,
    account_no , 

    date
HAVING COUNT(*) > 1

1
彼の結果の通知に2は数が含まれています4- Account_no私が思うグループを破棄したいと思うでしょう。
JNK、2011

「同じアカウント番号で1日に複数回の支払いが行われるすべてのユーザー」が正しかったと思います。
Conrad Frix、2011

それはそれを言っていますが、彼の結果はそうではありません。両方のバージョンにメモが付いている可能性があります。
JNK、2011

ご回答ありがとうございます。私はそれでうまくいくと思います。同じ日付で請求の郵便番号(同じテーブル、異なる列)が異なるかどうかをチェックする別のフィルターを追加したい場合、このクエリをどのように変更しますか?
ベンジャミンムシュコ

サンプル出力を解決できません。アカウントを削除すると、3つの行が表示されます。日付とアカウントの両方をドロップすると、2つの行1,3と2,4が表示されます。だから私は先に進み、出力上の言葉を信頼するつもりです
Conrad Frix

43

このクエリを試してください:

SELECT column_name
  FROM table_name
 GROUP BY column_name
HAVING COUNT(column_name) = 1;

4
きちんと、しかしこれは質問に答えません
Lambart

4

このHAVINGキーワードは初心者にはお勧めしません。基本的にはレガシー目的のためです。

このテーブルのキーは何なのかはっきりしていません(完全に正規化されているのでしょうか?)。そのため、仕様に従うのは難しいと思います。

同じアカウント番号で1日に複数回の支払いを行うすべてのユーザーのすべてのレコードを検索したい...さらに、郵便番号が異なるレコードのみをカウントするフィルターがあるはずです。

だから私は文字通りの解釈をしました。

以下は、より冗長ですが、理解し、したがって、私が使用した(維持することが容易にできCTEをテーブルに対してPAYMENT_TALLIESけどそれができますVIEW

WITH PAYMENT_TALLIES (user_id, zip, tally)
     AS
     (
      SELECT user_id, zip, COUNT(*) AS tally
        FROM PAYMENT
       GROUP 
          BY user_id, zip
     )
SELECT DISTINCT *
  FROM PAYMENT AS P
 WHERE EXISTS (
               SELECT * 
                 FROM PAYMENT_TALLIES AS PT
                WHERE P.user_id = PT.user_id
                      AND PT.tally > 1
              );

2
create table payment(
    user_id int(11),
    account int(11) not null,
    zip int(11) not null,
    dt date not null
);

insert into payment values
(1,123,55555,'2009-12-12'),
(1,123,66666,'2009-12-12'),
(1,123,77777,'2009-12-13'),
(2,456,77777,'2009-12-14'),
(2,456,77777,'2009-12-14'),
(2,789,77777,'2009-12-14'),
(2,789,77777,'2009-12-14');

select foo.user_id, foo.cnt from
(select user_id,count(account) as cnt, dt from payment group by account, dt) foo
where foo.cnt > 1;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.