SQL的一个小问题,寻求更好的解决方案

听雨停了 2019-10-17 09:35:46
需求很简单,原始数据如下:


希望结果如下:


附上测试数据:
姓名 课程 分数 课程2 分数2
张三 语文 90 历史 95
张三 数学 91 物理 96
张三 英语 92 化学 97

另外说明:

--不想使用(因为数据量太大了,这样好慢,有没有什么比较快的方式)
select 姓名,课程,分数 from tab
union all
select 姓名,课程2,分数2 from tab
...全文
138 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
听雨停了 2019-10-21
  • 打赏
  • 举报
回复
感谢大家的帮助
xiaoxiangqing 2019-10-18
  • 打赏
  • 举报
回复
最好的方式是改表设计
Hello World, 2019-10-18
  • 打赏
  • 举报
回复
最好的方式还是像版主说的改表结构
Hello World, 2019-10-18
  • 打赏
  • 举报
回复
使用cross apply或者OUTER APPLY加上values即可:

DECLARE @tab TABLE(姓名 NVARCHAR(10), 课程 NVARCHAR(10), 分数 INT, 课程2 NVARCHAR(10), 分数2 INT);

INSERT @tab(姓名, 课程, 分数, 课程2, 分数2)
VALUES('张三', '语文', 90, '历史', 95),
('张三', '数学', 91, '物理', 96),
('张三', '英语', 92, '化学', 97);
--查询语句:
SELECT t.姓名,
a.课程,
a.分数
FROM @tab t
OUTER APPLY(SELECT * FROM (VALUES(t.分数, t.课程), (t.分数2, t.课程2)) AS f(分数, 课程) )a;

结果:
吉普赛的歌 版主 2019-10-18
  • 打赏
  • 举报
回复
union all 你都觉得慢, 那没有更好的方式了。 把表结构改成: 姓名 课程 分数 旧表数据插入到新表, 再创建索引就快了。 长痛不如短痛, 修改不合理的设计是应该做的。
文盲老顾 2019-10-18
  • 打赏
  • 举报
回复
with t as ( select '张三' as 姓名,'语文' as 课程,90 as 分数,'历史' as 课程2,95 as 分数2 union all select '张三' as 姓名,'数学' as 课程,91 as 分数,'物理' as 课程2,96 as 分数2 union all select '张三' as 姓名,'英语' as 课程,92 as 分数,'化学' as 课程2,97 as 分数2 ) select 姓名,课程n as 课程,(case when val='课程' then 分数 else 分数2 end) as 分数 from t unpivot (课程n for val in (课程,课程2)) p1
sxq129601 2019-10-18
  • 打赏
  • 举报
回复
union all 其实是最快的,你说速度慢,我真的不相信。改其他的肯定没union all快

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧