带有GROUP BY id的T-SQL SELECT

时间:2013-04-03 11:18:35

标签: sql select group-by

我有''

的表格

  • ID
  • 名称
  • 年龄

带有'备注'的表格:

  • ID
  • 文本
  • 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 ║
╚═══════╩═════╩════════════╝

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

4 个答案:

答案 0 :(得分:6)

由于您希望获取表People中的所有记录,因此您需要使用Notes将其与LEFT JOIN一起加入,以便Notes上没有任何记录的任何用户都将包含在列表中,其值为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 ║
╚════╩═══════╩═════╩════════════╝

答案 1 :(得分:3)

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

答案 2 :(得分:2)

您也可以使用子查询来完成此任务 -

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

答案 3 :(得分:2)

您也可以先从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 |