[sql] count> 1 인 레코드를 찾기위한 SQL 쿼리

라는 이름의 테이블이 PAYMENT있습니다. 이 표에는 사용자 ID, 계정 번호, 우편 번호 및 날짜가 있습니다. 동일한 계좌 번호로 하루에 두 번 이상 결제 한 모든 사용자에 대한 모든 레코드를 찾고 싶습니다.

업데이트 : 또한 우편 번호가 다른 레코드 만 계산하는 필터가 있어야합니다.

이것은 테이블의 모습입니다 :

| user_id | account_no | 지퍼 | 날짜 |
| 1 | 123 | 55555 | 12-DEC-09 |
| 1 | 123 | 66666 | 12-DEC-09 |
| 1 | 123 | 55555 | 12 월 13 일 |
| 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 | 카운트 |
| 1 | 2 |

이것을 SQL 쿼리로 어떻게 표현 하시겠습니까? 나는 자기 참여를 생각하고 있었지만 어떤 이유로 든 내 카운트가 잘못되었습니다.



답변

행을 고유하게 만드는 필드 에서 HAVING 절 및 GROUP By를 사용하십시오.

아래는 찾을 것이다

동일한 계좌 번호로 하루에 두 번 이상 결제 한 모든 사용자

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

업데이트
만 별개의 우편 번호를 가지고 그 사람들을 포함하려면 먼저 별개의 세트를 가져온 다음 / GROUP BY를 HAVING을 수행 할 수 있습니다

 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;


답변

HAVING초보자에게는 키워드를 권장하지 않습니다 . 기본적으로 레거시 목적 입니다.

이 테이블의 키가 무엇인지 잘 모르겠습니다 ( 완전히 표준화 되었습니까?

동일한 계좌 번호로 하루에 여러 번 지불 한 모든 사용자에 대한 모든 레코드를 찾고 싶습니다 … 또한 우편 번호가 다른 레코드 만 계산하는 것보다 필터가 있어야합니다.

문자 그대로 해석했습니다.

다음은 더 장황하지만 이해하기 쉽고 유지 관리하기가 쉽습니다 ( 테이블에 CTE 를 사용 PAYMENT_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
              );


답변

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;


답변