带有 GROUP BY id 的 T-SQL SELECT

Posted

技术标签:

【中文标题】带有 GROUP BY id 的 T-SQL SELECT【英文标题】:T-SQL SELECT with GROUP BY id 【发布时间】: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 ║
╚═══════╩═════╩════════════╝

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

【问题讨论】:

【参考方案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
SQLFiddle Demo

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

Visual Representation of SQL Joins

输出

╔════╦═══════╦═════╦════════════╗
║ 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 分组,它们都会有所不同。

以上是关于带有 GROUP BY id 的 T-SQL SELECT的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL:GROUP BY,但保留一个未分组的列(或重新加入它)?

T-Sql语法:GROUP BY子句GROUPING SETSCUBEROLLUP

带有 MAX() 的 GROUP BY 返回错误的行 ID

T-SQL GROUP BY 也使用 JOIN、聚合和外部引用错误

如何在 SELECT 部分中包含 BIT 类型列而不在 T-SQL 中的 GROUP BY 中包含它?

带有“默认值”的 SQL GROUP BY