[英]sql pivot for dynamically generated columns
我无法弄清楚如何将行设置为cols或使用pivot来动态生成cols。 有3个表 - tblEmp,tblLeaveType和tblEmpLeaves。 结果集现在是
EmpId Name Type Days
--------------------
1 john al 5
1 john cl 2
2 smith al 3
3 jack sl 4
我想以它的方式得到它。
EmpId Name al cl sl
--------------------------------
1 john 5 2 null
2 smith 3 null null
3 jack null null 4
请假类型可以动态添加。 请检查这里的小提琴 - http://sqlfiddle.com/#!3/6ad02e/1使用sql server 2008,c#
如果只想使用SQL获取最终结果,则可以实现PIVOT功能。 在尝试编写动态SQL版本之前,您应该首先编写一个硬编码版本,这样您就可以获得正确的基本逻辑。
如果您需要将有限数量的types
转换为列,则可以使用:
select id, name, al, cl, sl
from
(
select e.id, e.name, lt.type, l.days
from tblEmp e
left outer join tblEmpLeaves l
on e.id = l.empId
left outer join tblLeaveType lt
on l.leaveId = lt.Id
) d
pivot
(
max(days)
for type in (al, cl, sl)
) piv
order by id;
请参阅SQL Fiddle with Demo 。
但是,如果您将拥有未知数量的值,那么您必须使用动态SQL,并将代码放在存储过程中:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(type)
from tblLeaveType
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT id, name,' + @cols + '
from
(
select e.id, e.name, lt.type, l.days
from tblEmp e
left outer join tblEmpLeaves l
on e.id = l.empId
left outer join tblLeaveType lt
on l.leaveId = lt.Id
) x
pivot
(
max(days)
for type in (' + @cols + ')
) p
order by id'
execute sp_executesql @query;
请参阅SQL Fiddle with Demo 。 他们都给你结果:
| ID | NAME | AL | CL | SL |
|----|-------|--------|--------|--------|
| 1 | john | 5 | 2 | (null) |
| 2 | smith | 3 | (null) | (null) |
| 3 | jack | (null) | (null) | 4 |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.