对于给定和输出,您根本不需要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