从列值创建数据透视表

时间:2013-12-16 02:41:02

标签: sql-server tsql pivot

我有许多设备合同记录,需要显示每件设备和合同的可用天数。

例如,该表可能包含跨越不同时期的同一件设备的多个合同,我需要显示每年设备可用的天数。

表结构如下;

CREATE TABLE [dbo].[tblContracts]
(
[ID]            [int]       NOT NULL    IDENTITY(1,1) ,
[EquipmentId]       [int]       NOT NULL,
[ContractTypeId]    [int]       NOT NULL,
[FromDt]        [datetime]  NOT NULL,
[SpudDt]        [datetime]  NULL,
[ToDt]          [datetime]  NOT NULL
)

我需要的结果看起来像;

EquipmentId  2012  2013  2014  2015
1             120   365   180    30

我有一个函数,给定设备ID和年份,将返回设备在指定年份可用的总天数,但是,除了创建一些动态SQL,我不知道如何返回数据以所需格式。

有人有任何建议吗?

提前致谢。

3 个答案:

答案 0 :(得分:2)

你的问题有点模糊。例如,可用的意思是什么?功能是什么?

以下内容可能会满足您的需求:

select EquipmentId,
       sum(MyFunc(EquipmentId, 2012)) as [2012],
       sum(MyFunc(EquipmentId, 2013)) as [2013],
       sum(MyFunc(EquipmentId, 2014)) as [2014],
       sum(MyFunc(EquipmentId, 2015)) as [2015]
from tblContracts c
group by EquipmentId;

答案 1 :(得分:0)

我最终不得不使用动态SQL来解决问题,虽然看起来很可惜没有类似功能的枢轴来执行这个相对简单的要求。

答案 2 :(得分:0)

亲爱的雷布拉克这个会工作,我的表结构正确答案。 请注意,如果闰年,您应减去366

   SELECT T.EquipmentId,
       365 - T.[2013] AS [2013],
       365 - T.[2014] AS [2014],
       365 - T.[2015] AS [2015]
   FROM   (SELECT EquipmentId,
           [2013],
           [2014],
           [2015]
    FROM   (SELECT EquipmentId,
                   Datepart(Year, ToDt)        AS Yr,
                   Datediff(Day, FromDt, ToDt) AS Diff
            FROM   tblContracts
            ) X PIVOT 
            ( Sum(Diff)
                 FOR Yr IN([2013],
                           [2014],
                           [2015]) 
            )P
   )T 

结果

    --------------------------------------------
    EquipmentId |    2013   |   2014  | 2015
    --------------------------------------------
    1           |    351    |   337   | 337