例如有一张只有一列数据的表 table1
| name|
| 张三 |
| 李四 |
| 王五 |
| 赵六 |
想转化成如下形式
| a | b | c | d |
| 张三 | 李四 | 王五 | 赵六 |
请问在sql server中怎样进行实现呢?
原本是列(字段值)---》行(字段),其实你有没有注意到,一般咱查询某个字段时,该字段就是行,然后当我们自定义字段(或者假定某种条件下的字段)进行查询表,该假定的条件也会成为新的字段,例如(先扫一眼我的表):
我们要做的就是给新字段,起个简单有意义的别名,例如:
可以借助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
可以参考一下这个文章
有多少列就表示需要多少个case when
参考:
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