Для заданных входов и выходов вам вообще не нужно 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
EDIT
В то время как 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