Как получить сумму суммы между разными периодами - PullRequest
0 голосов
/ 04 августа 2011

Я использую SQL Server 2008, и у меня возникла эта проблема.

У меня есть таблица, в которой есть поле задания, поле даты и поле стоимости.Поле даты содержит даты, когда работа была выполнена для определенной работы, в то время как поле стоимости содержит сумму, потраченную на эту дату (работа может быть выполнена за несколько дней для одной работы)

Я хочу создать оператор выборатаким образом, что я получаю сумму затрат, потраченных между 0-7 и 8-30 днями на открытие работы в разных столбцах.

Я пробовал это:

select a.[Job No_], DATEDIFF(day, MIN(b.[Posting Date]), a.[Ending Date]) as [WIP Age],
       SUM(b.[Total Cost])[Total WIP cost]
  [0 - 7 days]=case
         when (DATEDIFF(day, MIN(b.[Posting Date]), a.[Ending Date]) between 1 and 7) then
            SUM(b.[Total Cost])
        else 0
    end,
    [8 - 30 days]=case
        when (DATEDIFF(day, MIN(b.[Posting Date]), a.[Ending Date]) between 8 and 30) then
            SUM(b.[Total Cost])
        else 0
    end,
    [> 30 days]=case
        when (DATEDIFF(day, MIN(b.[Posting Date]), a.[Ending Date]) > 30) then
            SUM(b.[Total Cost])
        else 0
    end
 from [Job]a 
 right join [Job Ledger Entry]b
 on b.[Job No_] = a.[No_] 
 group by a.[No_]

Отображает результат, аналогичныйэто:

Job No_  WIP Age    Total WIP cost    0 - 7 days   8 - 30 days   > 30 days
 0001      40           9526.18          0           0             9526.18
 0002      27           1178.49          0        1178.49            0
 0003      3            2838.94       2838.94        0               0

Это не то, что я хочу, я хочу, чтобы все расходы были потрачены между 0 - 7 днями, 8 - 30 днями и> 30 днями соответственно.

1 Ответ

0 голосов
/ 05 августа 2011

Следующее может работать лучше:

SELECT
  a.[Job No_],
  [WIP Age] = DATEDIFF(day, MIN(b.[Posting Date]), MAX(a.[Ending Date])),
  [Total WIP cost] = SUM(b.[Total Cost]),
  [0 - 7 days] = SUM(CASE
    WHEN (DATEDIFF(DAY, b.[Posting Date], a.[Ending Date]) BETWEEN 1 AND 7)
    THEN SUM(b.[Total Cost])
  END),
  [8 - 30 days] = SUM(CASE
    WHEN (DATEDIFF(DAY, b.[Posting Date], a.[Ending Date]) BETWEEN 8 AND 30)
    THEN b.[Total Cost]
  END),
  [> 30 days] = SUM(CASE
    WHEN (DATEDIFF(day, b.[Posting Date], a.[Ending Date]) > 30)
    THEN b.[Total Cost]
  END)
FROM [Job] a
  RIGHT JOIN [Job Ledger Entry] b ON b.[Job No_] = a.[No_]
GROUP BY a.[No_]

Объяснение: Я поместил все выражения CASE в соответствующие суммы.Я также применил MAX () к a.[Ending Date] в первом DATEDIFF, потому что использование этого столбца без агрегирования казалось неправильным.

...