SQL Server行列的简单操作

1.SQL Server 多行转成一列(并以","隔开)

话不多说直接开始。
例如下表,我们取别名为A, select * from 【table name】AS A
在这里插入图片描述
SQL语句:

SELECT  name ,
        value = ( STUFF(( SELECT ',' + value 
                          FROM      A
                          WHERE     name = Test.name
                        FOR
                          XML PATH('')
                        ), 1, 1, '') )
FROM    A AS Test
GROUP BY name;

这样我们得到的结果是
在这里插入图片描述

2.一列转成多行数据

原始数据表定义为 YSSJ,我们把它拆开。
在这里插入图片描述
SQL语句:

SELECT a.[name],b.[value]
FROM (SELECT [name],[value]=CAST('<v>'+REPLACE([value],',','</v><v>')+'</v>' AS xml) FROM  YSSJ) a
OUTER APPLY (SELECT [value]=T.C.value('.','varchar(50)') FROM a.[value].nodes('/v') AS T(C)) b

得到的结果是这样的:
在这里插入图片描述

3.简单的行转列,也可以在后边加一些函数进行简单计算

先来一个原始数据表,CJ(加一个平均分)
在这里插入图片描述
SQL语句:

SELECT 姓名,

max(CASE 课程 WHEN '语文' THEN 分数 ELSE 0 end)语文,

max(CASE 课程 WHEN '数学' THEN 分数 ELSE 0 end)数学,

max(CASE 课程 WHEN '物理' THEN 分数 ELSE 0 end)物理,

sum(分数)总分,

cast(avg(分数*1.0)AS DECIMAL(18,2))平均分

FROM CJ

GROUP BY 姓名

结果如下:
在这里插入图片描述

4.列转行

今天咱就折腾个明白,再将它拆开成一个名字跟着一个成绩。
在这里插入图片描述
SQL语句:

SELECT * FROM
(
 SELECT 姓名,课程='语文',分数=语文 FROM CJ
 UNION ALL
 SELECT 姓名,课程='数学',分数=数学 FROM CJ
 UNION ALL
 SELECT 姓名,课程='物理',分数=物理 FROM CJ
) t
ORDER BY 姓名,CASE 课程 WHEN '语文' THEN 1 WHEN '数学' THEN 2 WHEN '物理' THEN 3 end

结果如下:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值