C# 用于动态生成列的sql pivot
我不知道如何将行设置为cols,或者如何对动态生成的col使用pivot。 共有3个表格-tblEmp、tblLeaveType和TBLEMPLEVES。现在的结果集是C# 用于动态生成列的sql pivot,c#,sql-server-2008,C#,Sql Server 2008,我不知道如何将行设置为cols,或者如何对动态生成的col使用pivot。 共有3个表格-tblEmp、tblLeaveType和TBLEMPLEVES。现在的结果集是 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 ---
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
休假类型可以动态添加。请检查这里的小提琴-
使用sql server 2008,c#如果只想使用sql获得最终结果,则可以实现PIVOT函数。在尝试编写动态SQL版本之前,应始终先编写硬编码版本,以便获得正确的基本逻辑 如果需要转换为列的
类型数量有限,则可以使用:
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,并将代码放在存储过程中:
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;
看。它们都会给你结果:
| ID | NAME | AL | CL | SL |
|----|-------|--------|--------|--------|
| 1 | john | 5 | 2 | (null) |
| 2 | smith | 3 | (null) | (null) |
| 3 | jack | (null) | (null) | 4 |
非常感谢“蓝脚”