Sql 分组数据问题
我创建了虚拟表来探索SQL中的分组概念 我想把数据分组显示Sql 分组数据问题,sql,group-by,Sql,Group By,我创建了虚拟表来探索SQL中的分组概念 我想把数据分组显示 学生总分 要以逗号分隔的方式显示主题 我的问题:为什么SQL不允许在groupby子句中只保留StudentID,当我们提到ID、名称时,它是允许的,。。分组依据子句中的其他列 我得到这个错误: 列“SampleData.StudentName”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中 如何在SQL输出中以逗号分隔的方式显示主题 这是我编写的SQL: SELECT StudentID, Stud
groupby
子句中只保留StudentID
,当我们提到ID、名称时,它是允许的,。。分组依据
子句中的其他列
我得到这个错误:
列“SampleData.StudentName”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中
如何在SQL输出中以逗号分隔的方式显示主题
这是我编写的SQL:
SELECT
StudentID,
StudentName,
Standard,
Subject,
SUM(MarksObtained)
FROM
SampleData
GROUP BY
StudentID, StudentName
--,Standard
--,Subject
ORDER BY
StudentID
供参考的样本表:
StudentID StudentName Standard Subject MarksObtained
-----------------------------------------------------
1 A VI Maths 59
3 C VII English 62
2 B IX Maths 75
2 B IX English 81
1 A VI Science 47
1 A VI History 61
预期产出:
StudentID StudentName Standard Subject MarksObtained
-------------------------------------------------------------------
1 A VI Maths,Science,History 167
3 C VII English 62
2 B IX Maths,English 156
一个很好的做法是将
SELECT
ed的所有非聚集字段明确地放在groupby
子句中。一些RDBMS对其要求严格(例如Oracle),其他RDBMS可能不严格(例如sql模式下的MySQLONLY\u FULL\u GROUP\u BY
禁用)
要在单个字段中连接主题
,需要一个聚合函数。并非所有的关系数据库都有相同的标准。他们通常接受按订购的选项
使用SQL Server 2017或更高版本:STR_AGG
:
SELECT
StudentID
,StudentName
,Standard
,STR_AGG(Subject, ',') WITHIN GROUP ( ORDER BY StudentID)
,SUM(MarksObtained)
FROM
SampleData
GROUP BY
StudentID
,StudentName
,Standard
ORDER BY
StudentID
SELECT
StudentID
,StudentName
,Standard
,LISTAGG(Subject, ',') WITHIN GROUP ( ORDER BY StudentID)
,SUM(MarksObtained)
FROM
SampleData
GROUP BY
StudentID
,StudentName
,Standard
ORDER BY
StudentID
使用MySQL:GROUP\u CONCAT
:
SELECT
StudentID
,StudentName
,Standard
,GROUP_CONCAT(Subject ORDER BY StudentID SEPARATOR ', ')
,SUM(MarksObtained)
FROM
SampleData
GROUP BY
StudentID
,StudentName
,Standard
ORDER BY
StudentID
使用Oracle 11g或更高版本:listag
:
SELECT
StudentID
,StudentName
,Standard
,STR_AGG(Subject, ',') WITHIN GROUP ( ORDER BY StudentID)
,SUM(MarksObtained)
FROM
SampleData
GROUP BY
StudentID
,StudentName
,Standard
ORDER BY
StudentID
SELECT
StudentID
,StudentName
,Standard
,LISTAGG(Subject, ',') WITHIN GROUP ( ORDER BY StudentID)
,SUM(MarksObtained)
FROM
SampleData
GROUP BY
StudentID
,StudentName
,Standard
ORDER BY
StudentID
关于你的第一个问题:
当您发出聚合(如sum、count、max、min、avg)时,您需要对其他非聚合列进行分组。聚合是针对分组列进行的
在英语中,你的疑问意味着
获取从样本数据中获得的有关StudentID、StudentName、Standard、Subject的标记总和
关于第二个问题:
我们需要知道您正在使用哪个DBMS。每个DBMS系统都有自己的方法
- Oracle有
listag(列“,”)
- MySQL有
GROUP_CONCAT(列“,”)
- SQL Server有
STR_AGG(列“,”)
- PostgreSQL具有
string_agg(列,,)
您正在使用哪些数据库管理系统?SQL Server。但是,我需要通用查询,它将在所有服务器上工作。对于字符串concat,您不能使用通用查询。请检查我的答案,了解更多信息。现在清楚了。如果有任何与此相关的查询,将再次发布。任何想法,如何在SQL Server 2012中实现这一点?感谢@GMB提供这些信息。公平地说,如果SQL模式包括仅包含
,MySQL在默认情况下从MySQL 5.7.5(2014-09-25)起启用,MySQL对分组规则并不松懈。因此,无论DBMS是否允许,在GROUP BY子句中包含所有未加标记的字段始终是一种良好的做法。@BillKarwin:是的,您是对的,MySQL从那时起就不那么松散了,我更新了我的答案以提及它。@AnujThite:是的,没错。谢谢大家。我将在进行SQL开发时将此作为经验法则。。