SQL sever 列转行

1、先建立一个员工子女表B

 1 create table B(
 2 YG VARCHAR(20),  --员工名
 3 BB1 VARCHAR(20),  --孩子1
 4 BB2 VARCHAR(20),  --孩子2
 5 BB3 VARCHAR(20)   --孩子3
 6 )
 7 
 8 
 9 INSERT INTO B VALUES
10 ('赤井','一郎','二郎','三郎'),
11 ('工藤','春子','夏子',''),
12 ('铃木','夏子','',''),
13 ('吉田','','','')

2、查询结果如下

YG  BB1 BB2 BB3
赤井 一郎  二郎  三郎
工藤 春子 夏子   
铃木 夏子     
吉田      

 

 

 

 

 

 

 

3、通过 union all

1 SELECT yg,BB1 as bb FROM B
2 union all
3 SELECT yg,BB2 as bb FROM B
4 union all 
5 SELECT yg,BB3 as bb FROM B

   union all会将为空的列也查询出来,如果加上不为空的条件(<>'',因为插数据不是null所以用<>''),

就能查出所有有子女的员工及子女名,反之查询所有没小孩员工

4、有无子女员工全部查询,为了简化查询,创建视图查询所有小孩名去重非空

1 create view st(bb)
2 as select bb1 from B where bb1 <>''
3 union
4 select BB2 from B where bb2 <>''
5 union
6 select bb3 from B where bb3 <>''

5、然后用左连接left ,这样B表员工全部展现,子女没有就会为null展示

1 select b1.yg,st.bb from B b1 
2 left join st 
3 on st.bb in (b1.BB1,b1.bb2,b1.bb3) group by  b1.yg,st.bb 

查询结果如下

yg  bb
赤井 二郎
赤井 三郎
赤井 一郎
工藤 春子
工藤 夏子
吉田 NULL
铃木 夏子

 

 

 

 

 

 

 

 

 

6、或者觉得NULL难看可以自定义NULL值

1 select b1.yg,
2 case when st.bb is null then '单身贵族' else st.bb end 列名 from B b1 
3 left join st 
4 on st.bb in (b1.BB1,b1.bb2,b1.bb3) group by  b1.yg,st.bb 

 

posted @ 2021-01-26 16:18  巨菜的小鸟  阅读(223)  评论(0)    收藏  举报