我如何 sql 透视列
How can i sql pivot column
我看过很多关于数据透视表的问题 tables.Even 如果他们不知道他们在问数据透视表,......
- 什么是枢轴?
- 我如何旋转?
- 我如何旋转这些数据?
+---------+----------+----------+
| Subject | Semester | Attendee |
+---------+----------+----------+
| ITB001 | 1 | John |
| ITB001 | 1 | Bob |
| ITB001 | 1 | Mickey |
| ITB001 | 2 | Jenny |
| ITB001 | 2 | James |
| MKB114 | 1 | John |
| MKB114 | 1 | Erica |
+---------+----------+----------+
至
像这样
+----------+----------+----------------+
| Attendee | Semester | Subject |
+----------+----------+----------------+
| John | 1 | ITB001,MKB114 |
| Bob | 1 | ITB001 |
+----------+----------+----------------+
这根本不是一个数据透视表,它是字符串聚合。
在 SQL Server 2017+ 或 Azure SQL 数据库中:
SELECT Attendee, Semester, Subjects = STRING_AGG(Subject, ',')
FROM dbo.SomeTableName
GROUP BY Attendee, Semester;
在较旧和不受支持的版本上,它更丑陋得多,更不用说效率低下了:
SELECT ost.Attendee, ost.Semester, Subjects = STUFF((
SELECT ',' + ist.Subject
FROM dbo.SomeTableName AS ist
WHERE ist.Attendee = ost.Attendee
AND ist.Semester = ost.Semester
FOR XML PATH(''),
TYPE).value(N'./text()[1]', N'varchar(max)'), 1, 1, '')
FROM dbo.SomeTableName AS ost
GROUP BY ost.Attendee, ost.Semester;
我看过很多关于数据透视表的问题 tables.Even 如果他们不知道他们在问数据透视表,......
- 什么是枢轴?
- 我如何旋转?
- 我如何旋转这些数据?
+---------+----------+----------+
| Subject | Semester | Attendee |
+---------+----------+----------+
| ITB001 | 1 | John |
| ITB001 | 1 | Bob |
| ITB001 | 1 | Mickey |
| ITB001 | 2 | Jenny |
| ITB001 | 2 | James |
| MKB114 | 1 | John |
| MKB114 | 1 | Erica |
+---------+----------+----------+
至 像这样
+----------+----------+----------------+
| Attendee | Semester | Subject |
+----------+----------+----------------+
| John | 1 | ITB001,MKB114 |
| Bob | 1 | ITB001 |
+----------+----------+----------------+
这根本不是一个数据透视表,它是字符串聚合。
在 SQL Server 2017+ 或 Azure SQL 数据库中:
SELECT Attendee, Semester, Subjects = STRING_AGG(Subject, ',')
FROM dbo.SomeTableName
GROUP BY Attendee, Semester;
在较旧和不受支持的版本上,它更丑陋得多,更不用说效率低下了:
SELECT ost.Attendee, ost.Semester, Subjects = STUFF((
SELECT ',' + ist.Subject
FROM dbo.SomeTableName AS ist
WHERE ist.Attendee = ost.Attendee
AND ist.Semester = ost.Semester
FOR XML PATH(''),
TYPE).value(N'./text()[1]', N'varchar(max)'), 1, 1, '')
FROM dbo.SomeTableName AS ost
GROUP BY ost.Attendee, ost.Semester;