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
结果如下: