Ben*_*hko 161 sql group-by count having
我有一张名为的桌子PAYMENT.在此表中,我有一个用户ID,一个帐号,一个邮政编码和一个日期.我想查找所有使用相同帐号每天付款多次的用户的所有记录.
更新:此外,应该有一个过滤器,而不是只计算邮政编码不同的记录.
这就是表格的样子:
| user_id | account_no | zip | date | | 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查询中表达这一点?我在想自己加入,但由于某种原因,我的计数是错误的.
Con*_*rix 316
使用HAVING子句和GROUP By使行唯一的字段
以下将找到
所有使用相同帐号每天付款多次的用户
SELECT
user_id ,
COUNT(*) count
FROM
PAYMENT
GROUP BY
account,
user_id ,
date
Having
COUNT(*) > 1
Run Code Online (Sandbox Code Playgroud)
更新 如果您只想包含具有不同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
Run Code Online (Sandbox Code Playgroud)
小智 38
试试这个查询:
SELECT column_name
FROM table_name
GROUP BY column_name
HAVING COUNT(column_name) = 1;
Run Code Online (Sandbox Code Playgroud)
我不会HAVING向新手推荐该关键字,它本质上是为了遗留目的。
我不清楚这个表的关键是什么(我想知道它是否完全标准化?),因此我发现很难遵循您的规范:
我想查找每天使用相同帐号进行多次付款的所有用户的所有记录...此外,应该有一个过滤器,而不是只计算邮政编码不同的记录。
所以我采取了字面解释。
下面的内容更详细,但更容易理解,因此也更容易维护(我在表中使用了CTEPAYMENT_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
);
Run Code Online (Sandbox Code Playgroud)