代码之家  ›  专栏  ›  技术社区  ›  DanM

T-SQL GROUP BY:包含其他分组列的最佳方式

  •  11
  • DanM  · 技术社区  · 17 年前

    select empID, fname, lname, title, dept, count(projectID)
    from employees E left join projects P on E.empID = P.projLeader
    group by empID
    

    …这将在MySQL中工作,但MS SQL更为严格,要求所有内容要么包含在聚合函数中,要么是GROUP BY子句的一部分。

    当然,在这个简单的例子中,我假设我可以在GROUPBY子句中包含额外的列。但我处理的实际查询相当复杂,包括对一些非聚合列执行的一系列操作。。。i、 例如,试图将它们全部包含在GROUPBY子句中会变得非常丑陋。

    那么,有没有更好的方法?

    5 回复  |  直到 6 年前
        1
  •  18
  •   eglasius    17 年前

    您可以让它围绕以下几行工作:

    select e.empID, fname, lname, title, dept, projectIDCount
    from
    (
       select empID, count(projectID) as projectIDCount
       from employees E left join projects P on E.empID = P.projLeader
       group by empID
    ) idList
    inner join employees e on idList.empID = e.empID
    

        2
  •  4
  •   DJ.    17 年前

    “试图将所有人都包括在分组条款中会变得非常丑陋。”

    是的-这是唯一的方法*-只需将非聚合列复制并粘贴到GROUPBY子句中,删除别名,就可以了。。。

    *你可以把它包装成一个嵌套的SELECT,但这可能同样难看。。。

        3
  •  2
  •   Jonathan Leffler    17 年前

    MySQL在允许您从GROUPBY子句中省略项方面是不寻常的,而且在技术上不符合SQL标准。在标准SQL中,select列表中的每个非聚合列必须在GROUP BY子句中完整列出(按名称或序号列出,但不推荐使用)。

    (哦,虽然MySQL与众不同,但它允许速记,这很好。)

        4
  •  2
  •   Niikola    17 年前

    您不需要加入子查询,因为不需要基于employees的empID创建group by-您可以在Project的projectLeader字段中执行此操作。

      select e.empID, e.fname, e.lname, e.title, e.dept, p.projectIDCount
        from employees e 
       inner join ( select projLeader, count(*) as projectIDCount
                      from projects
                     group by projLeader
                  ) p on p.projLeader = e.empID
    
        5
  •  1
  •   Mark Glasgow    16 年前

    select子句中的子查询也可能适用。它适用于给定的示例,但可能不适用于您正在处理的实际复杂查询。

    select
            e.empID, fname, lname, title, dept
            , (select count(*) from projects p where p.projLeader = e.empId) as projectCount
    from
       from employees E
    
        6
  •  1
  •   Braiam nahurmf    6 年前

    我想是这样的 empID 是结果join语句中的唯一id。如果是这样的话,你可以使用 distinct 以获得相同的结果。

    select distinct empID, fname, lname, title, dept, count(projectID)
    from employees E
    left join projects P on E.empID = P.projLeader