2013-12-16 111 views
0

我有許多設備合同記錄,需要顯示每件設備和合同每年的總可用天數。根據列值創建樞軸

例如,對於同一件設備,表格可能包含跨越不同時間段的多個合同,我需要顯示設備每年有多少天可用。

表結構看起來像;

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

你可以用動態的列值參考下面這個鏈接樞紐。 鏈接:: http://stackoverflow.com/questions/20284251/another-pivot-with-dynamic-fields –

回答

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; 
+0

「可用」是設備在給定年份內可供使用的天數。例如;如果2013年12月25日至2014年1月14日期間只有1份合同,則設備可在2013年6天,2014年15天。如果2014年2月1日至2014年2月1日期間有同樣設備記錄的第二份合同2014年2月10日,則該設備將在2104年提供26天。 該功能用於計算這些值。 –

+0

查詢需要額外的年份,因爲額外的合同被添加(我們預先約定6 - 7年的設備),所以硬編碼的任何東西都不適合。 –

+0

毫無疑問你可以創建動態sql.Do以後。 在gordon查詢中,MyFunc with year可以查找年份的第一天和最後一天。 然後在當年的第一天和最後一天之間查詢和求和。讓函數返回和值,以便您不在主函數中使用group。 – KumarHarsh

0

我最後不得不使用動態SQL來解決問題,雖然它似乎是一個遺憾有喜歡的功能沒有支點執行此相對簡單需求。

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