programing tip

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

itbloger 2020. 6. 7. 10:38
반응형

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초보자에게는 키워드를 권장하지 않습니다 . 기본적으로 레거시 목적 입니다.

이 테이블의 키가 무엇인지 확실하지 않습니다 ( 완전히 표준화 되었습니까? 궁금합니다). 따라서 귀하의 사양을 따르는 것이 어렵다는 것을 알았습니다.

I would like to find all records for all users that have more than one payment per day with the same account number... Additionally, there should be a filter than only counts the records whose ZIP code is different.

So I've taken a literal interpretation.

The following is more verbose but could be easier to understand and therefore maintain (I've used a CTE for the table PAYMENT_TALLIES but it could be a 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;

참고URL : https://stackoverflow.com/questions/7151401/sql-query-for-finding-records-where-count-1

반응형