【问题标题】:T-SQL SELECT with GROUP BY id带有 GROUP BY id 的 T-SQL SELECT
【发布时间】:2013-03-25 00:46:21
【问题描述】:

我的桌子上有“People

  • 身份证
  • 姓名
  • 年龄

和带有'Notes'的表格:

  • 身份证
  • 文字
  • FK_Author

我想从人员表中选择所有作者的笔记计数以及他们的姓名和年龄,但我想按 PERSON ID 分组,而不是姓名。很多情况下,人名相同,但ID显然总是不同的。

示例(输入)

人们:

╔════╦═══════╦═════╗
║ ID ║ NAME  ║ AGE ║
╠════╬═══════╬═════╣
║  1 ║ John  ║  12 ║
║  2 ║ Annie ║  29 ║
║  3 ║ John  ║  44 ║
╚════╩═══════╩═════╝

注意事项:

╔════╦═══════╦═══════════╗
║ ID ║ TEXT  ║ FK_AUTHOR ║
╠════╬═══════╬═══════════╣
║  1 ║ 'aaa' ║         1 ║
║  2 ║ 'aaa' ║         1 ║
║  3 ║ 'aaa' ║         2 ║
║  4 ║ 'aaa' ║         2 ║
║  5 ║ 'aaa' ║         3 ║
╚════╩═══════╩═══════════╝

预期结果:

╔═══════╦═════╦════════════╗
║ NAME  ║ AGE ║ TOTALCOUNT ║
╠═══════╬═════╬════════════╣
║ John  ║  12 ║          2 ║
║ Annie ║  29 ║          2 ║
║ John  ║  44 ║          1 ║
╚═══════╩═════╩════════════╝

当我选择数据时,如果我想选择此列,我也必须按名称分组,因为如果我不选择,我会收到错误。

【问题讨论】:

    标签: sql select group-by


    【解决方案1】:

    您也可以先从 Notes 表中获取计数,然后使用 People 表左连接,如下所示。

    Fiddle-demo(感谢 J W 提供的小提琴)

    select name, age, Notate_Count
    from People p left join (
            select fk_author, count(*) Notate_Count
            from Notes 
            group by fk_author ) x
         on p.Id = x.fk_author
    order by name --Ordering by name here, change as required
    
    |  NAME | AGE | NOTATE_COUNT |
    ------------------------------
    | Annie |  29 |            2 |
    |  John |  44 |            1 |
    |  John |  12 |            2 |
    

    【讨论】:

      【解决方案2】:

      由于您想从表People 中获取所有记录,因此您需要使用LEFT JOIN 将其与Notes 连接起来,因此Notes 上没有任何记录的任何用户都将包含在列表中,其v 值为totalCount 为零。

      SELECT  a.ID, a.Name, a.Age,
              COUNT(b.FK_Author) totalCount
      FROM    People a
              LEFT JOIN Notes b
                  ON a.ID = b.FK_Author
      GROUP   BY a.ID, a.Name, a.Age
      

      如需进一步了解联接,请访问以下链接:

      输出

      ╔════╦═══════╦═════╦════════════╗
      ║ ID ║ NAME  ║ AGE ║ TOTALCOUNT ║
      ╠════╬═══════╬═════╬════════════╣
      ║  1 ║ John  ║  12 ║          2 ║
      ║  2 ║ Annie ║  29 ║          2 ║
      ║  3 ║ John  ║  44 ║          1 ║
      ╚════╩═══════╩═════╩════════════╝
      

      【讨论】:

      • 这是错误的答案,就像我说的我不会按姓名/年龄分组。不同的人可以相同的列
      • 没有。你错了。此查询将为您提供所需的结果。请记住,您在 GROUP BY 子句中包含 ID
      • 如果您不想要ID,请仅从SELECT 子句中删除列名,而不是在GROUP BY 子句中。
      【解决方案3】:

      你也可以使用子查询来完成这个任务——

      select people.Name,people.Age,(select count(notes.id) 
                                       from notes 
                                      where notes.FK_Author= people.id)
      from people;
      

      【讨论】:

        【解决方案4】:
        SELECT P.ID,P.Name,P.Age,COUNT(N.ID)
        FROM People P 
        INNER JOIN Notes N ON N.FK_Author = P.ID
        GROUP BY P.ID,P.Name,P.age
        

        【讨论】:

        • 您必须按要在选择中显示的所有字段进行分组,但由于您首先按 ID 分组,它们都会有所不同。
        猜你喜欢
        • 2011-01-28
        • 2013-01-27
        • 1970-01-01
        • 2019-06-06
        • 2014-12-04
        • 1970-01-01
        • 2020-11-05
        • 2014-11-26
        • 1970-01-01
        相关资源
        最近更新 更多