带有 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
T-SQL GROUP BY 也使用 JOIN、聚合和外部引用错误