SQL Server 2016 GROUP BY + HAVING 只能通过 JOIN 得到不同的记录
SQL Server 2016 GROUP BY + HAVING only get different records by JOIN
我们有两个 table,一个用于用户,一个用于记录。 FK 给用户的记录有一个参考号和 link。我们想从记录 table 中获取参考编号,其中相同的参考编号用于不同的用户。如果两个用户具有相同的姓氏和相同的出生日期,则他们是同一用户。如果姓氏或出生日期不同,则两个用户是不同的用户。
示例数据:
DECLARE @user TABLE (id INT, fname VARCHAR, lname VARCHAR, dob VARCHAR(3))
DECLARE @record TABLE (id INT, refno VARCHAR, fk INT)
--first two are the same people because same firstname + lastname + date of birth
INSERT INTO @user SELECT 1, 'a', 'a', 'jan'
INSERT INTO @user SELECT 2, 'a', 'a', 'jan'
--next two are the same people because same firstname + lastname + date of birth
INSERT INTO @user SELECT 3, 'b', 'b', 'feb'
INSERT INTO @user SELECT 4, 'b', 'b', 'feb'
--next two are different people because same firstname + lastname but different date of birth
INSERT INTO @user SELECT 5, 'c', 'c', 'mar'
INSERT INTO @user SELECT 6, 'c', 'c', 'apr'
--next two are different people because same firstname + date of birth but but different surname
INSERT INTO @user SELECT 7, 'd', 'e', 'may'
INSERT INTO @user SELECT 8, 'd', 'f', 'may'
--next two are different people because same firstname + date of birth but but different surname
INSERT INTO @user SELECT 9, 'd', 'e', 'may'
INSERT INTO @user SELECT 10, 'd', 'f', 'may'
--with simplified ref nos
INSERT INTO @record SELECT 10, '1', 1
INSERT INTO @record SELECT 11, '1', 2
INSERT INTO @record SELECT 12, '2', 3
INSERT INTO @record SELECT 13, '2', 4
INSERT INTO @record SELECT 14, '3', 5
INSERT INTO @record SELECT 15, '3', 6
INSERT INTO @record SELECT 16, '3', 7
INSERT INTO @record SELECT 17, '3', 8
INSERT INTO @record SELECT 18, 'a', 9
INSERT INTO @record SELECT 19, 'a', 10
我尝试过的:
SELECT r.refno
, count(1) cnt
FROM @record r
INNER JOIN @user u ON u.id = r.fk
GROUP BY u.lname
, r.refno
, u.dob
HAVING COUNT(1) > 1
哪个returns:
refno cnt
1 2
2 2
但预期输出是:
refno cnt
3 4
a 2
谢谢。
只需使用以下内容修复您的 SQL
查询:
SELECT A.refno,
SUM(cnt) cnt
FROM
(
SELECT r.refno,
COUNT(*) cnt
FROM @record r
INNER JOIN @user u ON u.id = r.fk
GROUP BY u.lname,
r.refno,
u.dob
) A
WHERE A.cnt = 1
GROUP BY A.refno;
结果:
refno cnt
3 4
a 2
你可以试试这个:
SELECT refno
, COUNT(1) AS cnt
FROM (
SELECT DISTINCT u.lname
, r.refno
, u.dob
FROM @record r
INNER JOIN @user u ON u.id = r.fk
) AS t
GROUP BY refno
HAVING COUNT(1) > 1;
我们有两个 table,一个用于用户,一个用于记录。 FK 给用户的记录有一个参考号和 link。我们想从记录 table 中获取参考编号,其中相同的参考编号用于不同的用户。如果两个用户具有相同的姓氏和相同的出生日期,则他们是同一用户。如果姓氏或出生日期不同,则两个用户是不同的用户。
示例数据:
DECLARE @user TABLE (id INT, fname VARCHAR, lname VARCHAR, dob VARCHAR(3))
DECLARE @record TABLE (id INT, refno VARCHAR, fk INT)
--first two are the same people because same firstname + lastname + date of birth
INSERT INTO @user SELECT 1, 'a', 'a', 'jan'
INSERT INTO @user SELECT 2, 'a', 'a', 'jan'
--next two are the same people because same firstname + lastname + date of birth
INSERT INTO @user SELECT 3, 'b', 'b', 'feb'
INSERT INTO @user SELECT 4, 'b', 'b', 'feb'
--next two are different people because same firstname + lastname but different date of birth
INSERT INTO @user SELECT 5, 'c', 'c', 'mar'
INSERT INTO @user SELECT 6, 'c', 'c', 'apr'
--next two are different people because same firstname + date of birth but but different surname
INSERT INTO @user SELECT 7, 'd', 'e', 'may'
INSERT INTO @user SELECT 8, 'd', 'f', 'may'
--next two are different people because same firstname + date of birth but but different surname
INSERT INTO @user SELECT 9, 'd', 'e', 'may'
INSERT INTO @user SELECT 10, 'd', 'f', 'may'
--with simplified ref nos
INSERT INTO @record SELECT 10, '1', 1
INSERT INTO @record SELECT 11, '1', 2
INSERT INTO @record SELECT 12, '2', 3
INSERT INTO @record SELECT 13, '2', 4
INSERT INTO @record SELECT 14, '3', 5
INSERT INTO @record SELECT 15, '3', 6
INSERT INTO @record SELECT 16, '3', 7
INSERT INTO @record SELECT 17, '3', 8
INSERT INTO @record SELECT 18, 'a', 9
INSERT INTO @record SELECT 19, 'a', 10
我尝试过的:
SELECT r.refno
, count(1) cnt
FROM @record r
INNER JOIN @user u ON u.id = r.fk
GROUP BY u.lname
, r.refno
, u.dob
HAVING COUNT(1) > 1
哪个returns:
refno cnt
1 2
2 2
但预期输出是:
refno cnt
3 4
a 2
谢谢。
只需使用以下内容修复您的 SQL
查询:
SELECT A.refno,
SUM(cnt) cnt
FROM
(
SELECT r.refno,
COUNT(*) cnt
FROM @record r
INNER JOIN @user u ON u.id = r.fk
GROUP BY u.lname,
r.refno,
u.dob
) A
WHERE A.cnt = 1
GROUP BY A.refno;
结果:
refno cnt
3 4
a 2
你可以试试这个:
SELECT refno
, COUNT(1) AS cnt
FROM (
SELECT DISTINCT u.lname
, r.refno
, u.dob
FROM @record r
INNER JOIN @user u ON u.id = r.fk
) AS t
GROUP BY refno
HAVING COUNT(1) > 1;