對於給定和輸出,您根本不需要PIVOT
。簡單的UNION
和GROUP BY
就足夠了。
測試數據
DECLARE @Resources TABLE (
Resource VARCHAR(32)
, Nr INTEGER
, Cost FLOAT
, StartDate DATE
, EndDate DATE
)
INSERT INTO @Resources
SELECT 'Cable_5m', 8, 3.5, '03/12/2011', '03/13/2011'
UNION ALL SELECT 'Cable_5m', 2, 3.5, '03/13/2011', '03/14/2011'
UNION ALL SELECT 'Rope125A', 1, 0, '03/16/2011', '03/18/2011'
UNION ALL SELECT 'Rope125A', 1, 0, '03/17/2011', '03/17/2011'
SQL語句
SELECT DateOfEvnt
, Resource
, Nr = SUM(Nr)
, Cost
FROM (
SELECT Resource
, Nr
, Cost
, [DateOfEvnt] = StartDate
FROM @Resources
UNION ALL
SELECT Resource
, Nr
, Cost
, [DateOfEvnt] = EndDate
FROM @Resources
) r
GROUP BY
Resource
, Cost
, DateOfEvnt
編輯
雖然UNION
和GROUP BY
滿足的結果,我開始懷疑你是更需要像這樣的東西在WITH
聲明返回Start-
和EndDate
之間每天的記錄。
;WITH q AS (
SELECT Resource
, Nr
, Cost
, StartDate
, DateOfEvnt = StartDate
FROM @Resources
UNION ALL
SELECT q.Resource
, q.Nr
, q.Cost
, q.StartDate
, DATEADD(day, 1, q.DateOfEvnt)
FROM q
INNER JOIN @Resources s ON s.Resource = q.Resource
AND s.Nr = q.Nr
AND s.StartDate = q.StartDate
WHERE q.DateOfEvnt < s.EndDate
)
SELECT DateOfEvnt
, Resource
, Nr = SUM(Nr)
, Cost
FROM q
GROUP BY
DateOfEvnt
, Resource
, Cost
那17日不會給2xRope125A嗎? – 2011-05-16 08:51:46
@Damien - 是的。你是否複製粘貼腳本並得到不同的結果?第二版的 – 2011-05-16 08:58:16
+1。第一個版本確實給出了這個樣本數據的正確結果,但這是因爲第17行的Rope125A對第三行計數了兩次。一次用於StartDate,一次用於EndDate,不是因爲重疊。 – 2011-05-16 09:17:01