Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于动态生成列的sql pivot_C#_Sql Server 2008 - Fatal编程技术网

C# 用于动态生成列的sql pivot

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 ---

我不知道如何将行设置为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
--------------------------------
 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 |

非常感谢“蓝脚”