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


176

라는 이름의 테이블이 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 쿼리로 어떻게 표현 하시겠습니까? 나는 자기 참여를 생각하고 있었지만 어떤 이유로 든 내 카운트가 잘못되었습니다.

답변:


345

행을 고유하게 만드는 필드 에서 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

1
그의 결과에 통지 2의 개수가 있습니다 4-당신은 Account_no내가 생각 하는 그룹화 를 버리고 싶을 것입니다.
JNK

기다릴 필요도 없습니다. 원본이 "동일한 계좌 번호로 하루에 두 번 이상 결제하는 모든 사용자"라고 생각합니다.
콘래드 프릭스

그러나 그의 결과는 그렇지 않다는 것을 보여줍니다. 메모가있는 두 버전이있을 수 있습니다.
JNK

답변 주셔서 감사합니다. 그렇게해야한다고 생각합니다. 청구 우편 번호 (같은 테이블, 다른 열)가 같은 날짜와 다른지 확인하는 다른 필터를 추가하려면이 쿼리를 어떻게 수정합니까?
Benjamin Muschko

샘플 출력을 확인할 수 없습니다. 계정을 삭제하면 3 개의 행이 생깁니다. 날짜와 계정을 모두 삭제하면 1,3 및 2,4의 두 행이 나타납니다. 계속해서 출력에 대한 단어를 신뢰하겠습니다.
Conrad Frix

43

이 쿼리를 시도하십시오 :

SELECT column_name
  FROM table_name
 GROUP BY column_name
HAVING COUNT(column_name) = 1;

4
깔끔하지만, 이것은 질문에 대답하지 않습니다
Lambart

4

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
              );

2
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;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.