【问题标题】:How to select three columns from two tables and group by only two columns in SQL如何从两个表中选择三列并在SQL中仅按两列分组
【发布时间】:2019-01-29 23:23:27
【问题描述】:

我有一个正在运行的 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 始终是唯一的,所以它不会返回任何结果。

【问题讨论】:

  • “因为 NUMBER 永远是唯一的”是什么意思
  • 列的名称是 NUMBER。每个用户在该列中都有一个唯一值,因此它不能包含在 GROUP BY 中。
  • 如果 NUMBER 始终是唯一的,您可以将其添加到您的 GROUP BYstatement 中而不会产生任何负面结果。当然你也可以在SELECT 语句中使用MIN(NUMBER)MAX(NUMBER)
  • @schlonzo - 当我添加 NUMBER 时,我没有收到任何结果。

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


【解决方案1】:

如果您的 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 将具有相同名字和姓氏的用户计数添加到每条记录中,外部查询使用同音异义词过滤。

【讨论】:

    【解决方案2】:

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

    这样的事情应该可以工作。首先子查询获取重复的FirstName/LastName 对,然后主查询JOINs 返回原始表以显示您想要的输出。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-18
      • 1970-01-01
      • 2019-01-28
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 2010-09-07
      相关资源
      最近更新 更多