我有许多设备合同记录,需要显示每件设备和合同的可用天数。
例如,该表可能包含跨越不同时期的同一件设备的多个合同,我需要显示每年设备可用的天数。
表结构如下;
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,我不知道如何返回数据以所需格式。
有人有任何建议吗?
提前致谢。
答案 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