sql server 将一列n行数据转换成一行n列 怎么转化呢?

例如有一张只有一列数据的表 table1

| name|
| 张三 |
| 李四 |
| 王五 |
| 赵六 |
想转化成如下形式

| a | b | c | d |
| 张三 | 李四 | 王五 | 赵六 |
请问在sql server中怎样进行实现呢?

原本是列(字段值)---》行(字段),其实你有没有注意到,一般咱查询某个字段时,该字段就是行,然后当我们自定义字段(或者假定某种条件下的字段)进行查询表,该假定的条件也会成为新的字段,例如(先扫一眼我的表):

img

img

我们要做的就是给新字段,起个简单有意义的别名,例如:

img

可以借助Excel实现,首先将数据连同标题粘贴到excel中,然后剪切再旋转粘贴一下,保存并关闭。最后打开sql将excel导入到sql中即可。

你新表的abcd是哪里来的?
如果是table1里有个字段id的值是abcd的话
那么就用pivot

select * from pivot (max(name) for id in ('a','b','c','d'))

使用行转列:

select
t.[名称]
(select t.id,t.[名称]
(select a.id,
case when isnull(a.name,'')=‘’ then '' end as 名称
from username
)as t
group by  t.id
)

https://www.cnblogs.com/longphui/p/4914157.html
可以参考一下这个文章

传送门

img

有多少列就表示需要多少个case when

参考:

img

Case When的行转列

 CREATE   TABLE   Pivot  
 (   YEAR             SMALLINT,  
     QUARTER          TINYINT,    
     Amount           DECIMAL(2,1)   )  

 INSERT   INTO   Pivot   VALUES   (1990,   1,   1.1)  
 INSERT   INTO   Pivot   VALUES   (1990,   2,   1.2)  
 INSERT   INTO   Pivot   VALUES   (1990,   3,   1.3)  ;
 INSERT   INTO   Pivot   VALUES   (1990,   4,   1.4)  ;
 INSERT   INTO   Pivot   VALUES   (1991,   1,   2.1)  ;
 INSERT   INTO   Pivot   VALUES   (1991,   2,   2.2)  ;
 INSERT   INTO   Pivot   VALUES   (1991,   3,   2.3)  ;
 INSERT   INTO   Pivot   VALUES   (1991,   4,   2.4)  ;
 INSERT   INTO   Pivot   VALUES   (1992,   1,   3.1)  ;
 INSERT   INTO   Pivot   VALUES   (1992,   2,   3.2)  ;
 INSERT   INTO   Pivot   VALUES   (1992,   3,   3.3)  ;
 INSERT   INTO   Pivot   VALUES   (1992,   4,   3.4)  ;
 SELECT * FROM pivot;
 SELECT   YEAR,    
         SUM(CASE QUARTER WHEN 1 THEN Amount ELSE 0 END) AS Q1,  
         SUM(CASE QUARTER WHEN 2 THEN Amount ELSE 0 END) AS Q2, 
         SUM(CASE QUARTER WHEN 3 THEN Amount ELSE 0 END) AS Q3, 
         SUM(CASE QUARTER WHEN 4 THEN Amount ELSE 0 END) AS Q4
 FROM Pivot  
 GROUP BY YEAR  ;

按照年度分类,展示每个季度的账户金额
注意:要用sum函数求和,原因:(Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略
SELECT * FROM pivot;的结果

在这里插入图片描述

 SELECT   YEAR,    
         SUM(CASE QUARTER WHEN 1 THEN Amount ELSE 0 END) AS Q1,  
         SUM(CASE QUARTER WHEN 2 THEN Amount ELSE 0 END) AS Q2, 
         SUM(CASE QUARTER WHEN 3 THEN Amount ELSE 0 END) AS Q3, 
         SUM(CASE QUARTER WHEN 4 THEN Amount ELSE 0 END) AS Q4
 FROM Pivot  
 GROUP BY YEAR  ;

的结果

在这里插入图片描述

人名表:
| name|
| 张三 |
| 李四 |
| 王五 |
| 赵六 |
想转化成如下形式

| a | b | c | d |
| 张三 | 李四 | 王五 | 赵六 |

那就查询语法如下:

select
 case when name='张三' then name else '' end '张三'
 case when name='李四' then name else '' end '李四'
 case when name='王五' then name else '' end '王五'
case when name='赵六' then name else '' end '赵六'
from 人名表

最后补充一下case-when结构,就跟java的switch-case一样啦,如果。。。就。。。(也可以作为if使用)
上面的 case when name='张三' then name else '' end '张三'【对应的语法:case when 条件 then 结果 end】是不是很像 if 哈哈哈
当有多个条件时,语法是:
case
when 条件1 then 结果1
when 条件2 then 结果2
when 条件3 then 结果3
else (相当于switch-case中的default啦)
end