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クエリでどのように表現しますか。私は自己参加を考えていましたが、どういうわけか私の計算が間違っています。
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
このクエリを試してください。
SELECT column_name
FROM table_name
GROUP BY column_name
HAVING COUNT(column_name) = 1;
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;
私は初心者にHAVING
キーワードを推薦しません、それは本質的にレガシーの目的のために です 。
この表の鍵が何であるかはっきりしていません( 完全に正規化されていますか 、不思議ですか)、その結果、仕様に従うのは困難です:
同じ口座番号で1日に複数の支払いがあるすべてのユーザーのすべてのレコードを見つけたいのですが。さらに、郵便番号が異なるレコードだけをカウントするフィルタが必要です。
だから私は文字通りの解釈をしました。
以下はより冗長ですが、理解しやすくするために保守します(テーブルPAYMENT_TALLIES
に CTE を使用しましたが、 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
);