211

我有一张名为PAYMENT. 在这张表中,我有一个用户 ID、一个帐号、一个邮政编码和一个日期。我想查找所有使用相同帐号每天进行一次以上付款的用户的所有记录。

更新:此外,应该有一个过滤器,而不是只计算邮政编码不同的记录。

这是表格的样子:

| 用户 ID | 帐户号 | 拉链 | 日期 |
| 1 | 123 | 55555 | 2009 年 12 月 12 日 |
| 1 | 123 | 66666 | 2009 年 12 月 12 日 |
| 1 | 123 | 55555 | 2009 年 12 月 13 日 |
| 2 | 第456章 77777 | 09 年 12 月 14 日 |
| 2 | 第456章 77777 | 09 年 12 月 14 日 |
| 2 | 第789章 77777 | 09 年 12 月 14 日 |
| 2 | 第789章 77777 | 09 年 12 月 14 日 |

结果应该类似于:

| 用户 ID | 计数 |
| 1 | 2 |

您将如何在 SQL 查询中表达这一点?我在考虑自我加入,但由于某种原因,我的计数是错误的。

4

4 回答 4

404

使用HAVING子句和 GROUP By 使行唯一的字段

下面会发现

每天使用相同帐号支付超过一笔款项的所有用户

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
于 2011-08-22T17:51:25.653 回答
57

试试这个查询:

SELECT column_name
  FROM table_name
 GROUP BY column_name
HAVING COUNT(column_name) = 1;
于 2014-09-08T13:51:33.713 回答
5

我不会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
              );
于 2011-08-23T08:51:13.347 回答
3
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;
于 2011-08-23T09:43:52.897 回答