Помогите! Невозможно получить требуемый результат - PullRequest
0 голосов
/ 16 мая 2011

Использование SQL Server 2008 (R2)

У меня есть набор результатов, который мне нужно отображать по-другому, в настоящее время он доступен как:

Resource    Nr  Cost    StartDate   EndDate  
Cable_5m    8   3.5 12/03/2011  13/03/2011  
Cable_5m    2   3.5 13/03/2011  14/03/2011  
Rope125A    1   0   16/03/2011  18/03/2011  
Rope125A    1   0   17/03/2011  17/03/2011  

Что мне нужно, чтобысообщить по дате, сколько отправлено каждого ресурса, как показано ниже:

DateOfEvnt Resource Nr Cost  
2011-03-12 Cable_5m 8 3.50  
2011-03-13 Cable_5m 10 3.50   
2011-03-14 Cable_5m 2 3.50  
2011-03-16 Rope125A 1 0.00  
2011-03-17 Rope125A 2 0.00  
2011-03-18 Rope125A 1 0.00

Я смотрел на Pivot, но не могу заставить его работать, и я не уверен, что Pivot - это то, чтоЯ нуждаюсь.Вся помощь будет с благодарностью получена.

1 Ответ

1 голос
/ 16 мая 2011

Для заданных входов и выходов вам вообще не нужно 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...