라는 이름의 테이블이 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;