211

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

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

テーブルは次のようになります。

| user_id | account_no | zip | 日付|
| 1 | 123 | 55555 | 2009年12月12日|
| 1 | 123 | 66666 | 2009年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クエリでどのように表現しますか?自分で参加しようと思っていたのですが、どういうわけかカウントが間違っています。

4

4 に答える 4

404

行を一意にするフィールドでHAVING句とGROUPByを使用します

以下が見つかります

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

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

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

 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初心者向けのキーワードはお勧めしません。基本的には従来の目的のためです。

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

同じ口座番号で 1 日に 1 回以上支払いを行っているすべてのユーザーのすべてのレコードを検索したいと考えています...さらに、郵便番号が異なるレコードのみをカウントするフィルターが必要です。

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

以下はより冗長ですが、理解しやすく、維持しやすい可能性があります (テーブルに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 に答える