web-dev-qa-db-ja.com

count> 1のレコードを検索するためのSQLクエリ

PAYMENTという名前のテーブルがあります。このテーブルには、ユーザーID、アカウント番号、郵便番号、および日付があります。同じ口座番号で1日に複数の支払いがあるすべてのユーザーのすべてのレコードを見つけたいのですが。

更新:さらに、郵便番号が異なるレコードを数えるだけのフィルタがあるはずです。

これがテーブルの外観です。

| user_id | account_no |ジップ|日付| 
 | 1 | 123 | 55555 | 12-DEC-09 | 
 | 1 | 123 | 66666 | 12-DEC-09 | 
 | 1 | 123 | 55555 | 13-DEC-09 | 
 | 2 | 456 | 77777 | 14-DEC-09 | 
 | 2 | 456 | 77777 | 14-DEC-09 | 
 | 2 | 789 | 77777 | 14-DEC-09 | 
 | 2 | 789 | 77777 | 14-DEC-09 | 

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

| user_id | count | 
 | 1 | 2 | 

これをSQLクエリでどのように表現しますか。私は自己参加を考えていましたが、どういうわけか私の計算が間違っています。

146

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
285
Conrad Frix

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

SELECT column_name
  FROM table_name
 GROUP BY column_name
HAVING COUNT(column_name) = 1;
34
user4019456
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;
2
iryndin

私は初心者にHAVINGキーワードを推薦しません、それは本質的にレガシーの目的のために です

この表の鍵が何であるかはっきりしていません( 完全に正規化されていますか 、不思議ですか)、その結果、仕様に従うのは困難です:

同じ口座番号で1日に複数の支払いがあるすべてのユーザーのすべてのレコードを見つけたいのですが。さらに、郵便番号が異なるレコードだけをカウントするフィルタが必要です。

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

以下はより冗長ですが、理解しやすくするために保守します(テーブルPAYMENT_TALLIESCTE を使用しましたが、 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
onedaywhen