SQLServer行转列实现思路记录
我们有两个主要的数据表:Score表和User表。我们需要通过SQL语句将Score表中的多行数据转换成列的形式展示。
方法一:静态SQL
```sql
SELECT
UID,
Name,
[英语] = AVG(CASE WHEN ScoreName = '英语' THEN Score ELSE NULL END),
[数学] = AVG(CASE WHEN ScoreName = '数学' THEN Score ELSE NULL END)
FROM Score
JOIN User ON Score.UID = User.ID
GROUP BY UID, Name;
```
方法二:动态SQL
```sql
DECLARE @columns NVARCHAR(MAX) = ''; -- 用于存储列名的变量
SELECT @columns = (SELECT STRING_AGG(QUOTENAME(ScoreName), ', ') FROM Score GROUP BY ScoreName ORDER BY ScoreName); -- 构建列名列表
DECLARE @sql NVARCHAR(MAX) = 'SELECT UID, Name, ' + @columns + ' FROM Score JOIN User ON Score.UID = User.ID GROUP BY UID, Name'; -- 构建完整的SQL语句
EXEC sp_executesql @sql; -- 执行动态SQL语句
```
方法三:Case When
你给出的方法三已经相当清晰,以下是稍作改动的版本:
```sql
SELECT
编号 = ROW_NUMBER() OVER(ORDER BY User.ID),
用户编号 = UID,
姓名 = Name,
英语 = MAX(CASE WHEN ScoreName = '英语' THEN Score ELSE NULL END),
数学 = MAX(CASE WHEN ScoreName = '数学' THEN Score ELSE NULL END)
FROM Score JOIN User ON Score.UID = User.ID GROUP BY UID, Name;
```
编程语言
- ThinkPad 笔记本如何调节LCD屏幕亮度
- Dreamweaver制作网页打开特效教程
- Win10 Mobile 10586升级后无限重启怎么办 硬重启帮您
- Win8系统提示音频设备有问题有一个或多个音频服
- Xbox One版Win10首个预览版9月份发布
- 如何在textarea文本输入区内实现换行
- Win10 Build 9901系统更新 预览版新版本下载
- McAfee Framework存在远程格式串处理漏洞
- Win10家庭版今日(7月30)正式在中国官方商城开卖
- Win10 Mobile预览版更新完10536.1000后才收到10536.100
- Win10 RS2更新了什么-Win10 RS2最终版本号1704首曝
- Windows7如何查看回收站对应的文件夹有哪些方法
- Win10让Charms栏回归桌面的方法教程
- 取消Windows XP系统开机启动画面的小技巧
- win8系统怎么下载安装USB百兆网卡?
- XP系统下磁盘空间变少了怎么办?XP系统磁盘空间