一个sql的演变过程--将字段值显示为字段
-----------------------题目----------------------
Name Subject Score
张三 语文 11
张三 数学 22
张三 历史 33
李四 语文 11
李四 数学 22
李四 历史 33
想变成
姓名 语文 数学 历史
张三 11 22 33
李四 11 22 33
Code

DECLARE @SQLStr VARCHAR(2000)
SET @SQLStr='SELECT Name'
SELECT @SQLStr=@SQLStr+', '''+Subject+'''= SUM(CASE Subject WHEN '''+Subject+''' THEN Score END)' FROM (SELECT DISTINCT Subject FROM TEST2) AS Test
--(SELECT DISTINCT Subject FROM TEST2) AS Test 此处AS Test 不能少,不然不识别查询来自于那个表
--在sql中单引号的转义需要两个单引号,如'''+Subject+'''翻译之后为 '+Subject+'
SELECT @SQLStr=@SQLStr+' FROM TEST2 GROUP BY Name'
--对结果集进行分组统计
EXEC (@SQLStr
-------------------------------------------------
解决步骤
1 建表给数据

2 第一感觉
SELECT Name,
'历史'=(CASE Subject when '历史' THEN Score end),
'数学'=(case Subject when '数学' then Score end),
'语文'=(case Subject when '语文' then Score end)
FROM TEST2
--判断其字段值,并将其转换为字段名称
'历史'=(CASE Subject when '历史' THEN Score end),
'数学'=(case Subject when '数学' then Score end),
'语文'=(case Subject when '语文' then Score end)
FROM TEST2
--判断其字段值,并将其转换为字段名称
显示效果如图:
观察结果,只需要再按照Name来进行group,并sum(科目)就可以得到如题的结果,因此转换为如下:
SELECT Name,
'历史'=SUM(CASE Subject when '历史' THEN Score end),
'数学'=SUM(case Subject when '数学' then Score end),
'语文'=SUM(case Subject when '语文' then Score end)
FROM TEST2
GROUP BY Name
'历史'=SUM(CASE Subject when '历史' THEN Score end),
'数学'=SUM(case Subject when '数学' then Score end),
'语文'=SUM(case Subject when '语文' then Score end)
FROM TEST2
GROUP BY Name
结果如图:
3 改善sql语句
终上所述的方法,不太理想需要进行一定的修改让其通用。
如下:

DECLARE @SQLStr VARCHAR(2000)
SET @SQLStr='SELECT Name'
SELECT @SQLStr=@SQLStr+', '''+Subject+'''= SUM(CASE Subject WHEN '''+Subject+''' THEN Score END)' FROM (SELECT DISTINCT Subject FROM TEST2) AS Test
--(SELECT DISTINCT Subject FROM TEST2) AS Test 此处AS Test 不能少,不然不识别查询来自于那个表
--在sql中单引号的转义需要两个单引号,如'''+Subject+'''翻译之后为 '+Subject+'
SELECT @SQLStr=@SQLStr+' FROM TEST2 GROUP BY Name'
--对结果集进行分组统计
EXEC (@SQLStr
4 打完收工~~~~
标签:
SQLServer
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述