如何从两个表中选择三列并在SQL中仅按两列分组

时间:2019-01-29 23:23:28

标签: sql sql-server group-by multiple-columns

我有一个正在运行的SQL查询,但是我需要再添加一列。该列在另一张表上,我不知道如何将它们组合在一起。

这是有效的代码...选择所有与另一个用户共享姓氏和名字的活跃用户(我们正在寻找重复的人)

SELECT UserTable.LastName, 
       UserTable.FirstName 
FROM UserTable
INNER JOIN InfoTable 
  ON InfoTable.ID=UserTable.ID
WHERE InfoTable.Number > 2500 and Infotable.Inactive = 0
GROUP BY FirstName, 
         LastName
HAVING COUNT(*) > 1;

我需要做的是修改此代码,以便我可以显示位于InfoTable上的NUMBER列,但是我不想在GROUP BY中包括NUMBER,因为NUMBER始终都是唯一的,因此将不会返回任何结果。

2 个答案:

答案 0 :(得分:0)

您不能SELECT以外的GROUP BY列。 GROUP BY子句告诉引擎从指定的列中创建组。将行分组后,您只能在SELECT子句中的GROUP BY列或未分组列的集合中。

类似的事情应该起作用。首先,子查询获得重复的FirstName / LastName对,然后主查询JOIN返回到原始表,以向您显示所需的输出。

SELECT I.Number, U.LastName, U.FirstName
FROM InfoTable I
JOIN UserTable U
ON I.ID = U.ID
JOIN
(
    SELECT U.LastName, U.FirstName
    FROM UserTable U
    JOIN InfoTable I
    ON U.ID = I.ID
    WHERE I.Number > 2500 AND I.Inactive = 0
    GROUP BY U.LastName, U.FirstName
    HAVING COUNT(*) > 1
) T
ON U.FirstName = T.FirstName AND U.LastName = T.LastName
ORDER BY I.Number, U.LastName, U.FirstName

答案 1 :(得分:0)

如果您的RDBMS支持Windows函数(又名OLAP函数),则只需执行以下操作:

SELECT x.*
FROM (
    SELECT 
        u.LastName, 
        u.FirstName,
        i.Number,
        COUNT(u.ID) OVER (PARTITION BY u.LastName, u.FirstName) cnt
    FROM 
        UserTable u
        INNER JOIN InfoTable i 
            ON  u.ID = I.ID
            AND i.Number > 2500 
            AND i.Inactive = 0
) x WHERE x.cnt > 1
ORDER BY 1, 2, 3

内部查询使用COUNT ... OVER向每个记录添加具有相同名字和姓氏的用户数,外部查询使用同音异义词过滤。