繁体   English   中英

用于动态生成列的sql pivot

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM