SQL Сводные записи по CASE WHEN - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь агрегировать сумму записей в зависимости от значения, соответствующего CASE WHEN. Я могу агрегировать сумму, но я не знаю, как сгруппировать записи в зависимости от значения description.

SQL Запрос:

SELECT
T1.Company, T1.DueDate, 
SUM(T1.Amount) AS TotalAmount,

DATEDIFF( day, CONVERT(DATETIME, CAST(T1.DueDate AS VARCHAR(8)), 112), DATEADD( day, - 1, CONVERT(DATETIME, CAST(T3.FromDate AS VARCHAR(8)), 112) ) ) AS Age,
CASE
      WHEN
         DATEDIFF( day, CONVERT(DATETIME, CAST(T1.DueDate AS VARCHAR(8)), 112), DATEADD( day, - 1, CONVERT(DATETIME, CAST(T3.FromDate AS VARCHAR(8)), 112) ) ) <= 0 
      THEN
         'Current'
      WHEN
         DATEDIFF( day, CONVERT(DATETIME, CAST(T1.DueDate AS VARCHAR(8)), 112), DATEADD( day, - 1, CONVERT(DATETIME, CAST(T3.FromDate AS VARCHAR(8)), 112) ) ) > 0 
         AND DATEDIFF( day, CONVERT(DATETIME, CAST(T1.DueDate AS VARCHAR(8)), 112), DATEADD( day, - 1, CONVERT(DATETIME, CAST(T3.FromDate AS VARCHAR(8)), 112) ) ) <= 30 
      THEN
        'Late'
END AS Description

FROM
    Table1 T1 
    LEFT JOIN
      Table2 T2 
      ON T1.Company = T2.Company 
      AND T1.YR = T2.YR 

    INNER JOIN
      Table3 T3 
      ON T1.Company = T3.Company 
      AND T3.YR = YEAR(CURRENT_DATE)

GROUP BY T1.Company,T1.DueDate, T3.FromDate

Мой запрос возвращает следующее.

 Company    | DueDate        | TotalAmount | Age  | Description
------------+----------------+-------------+------+------------
 123        | 20200423       |    150      |   7  |   Late
 123        | 20200604       |    18000    |  -35 |   Current
 123        | 20200515       |    500      |  -15 |   Current

Однако то, что я действительно хочу выполнить sh, - это агрегировать записи если они имеют одинаковое значение Description. Итак, правильный результат должен быть:

  Company   | TotalAmount  |Description |
------------+--------------+------------+
 123        |     150      |  Late
 123        |     18500    |  Current

2-я и 3-я строки находятся под «Текущим». Следовательно, следует объединить 2 строки и добавить 18000 + 500 = 18500. Столбцы DueDate и Age предназначены только для справки. Наиболее важные поля: TotalAmount и Description

Я пробовал группировать по псевдониму Description, который используется в CASE-WHEN, но у меня не получилось.

Я бы ценю любую помощь.

Спасибо!

1 Ответ

0 голосов
/ 07 мая 2020

Вы копируете и вставляете оператор CASE в предложение GROUP BY:

GROUP BY T1.Company, CASE WHEN ...

, что требует большого количества кода для повторения.

Или вы можете использовать общее табличное выражение (CTE):

;WITH
    cte AS 
    (
        SELECT
        T1.Company, T1.DueDate, T1.Amount

        DATEDIFF( day, CONVERT(DATETIME, CAST(T1.DueDate AS VARCHAR(8)), 112), DATEADD( day, - 1, CONVERT(DATETIME, CAST(T3.FromDate AS VARCHAR(8)), 112) ) ) AS Age,
        CASE
            WHEN
                DATEDIFF( day, CONVERT(DATETIME, CAST(T1.DueDate AS VARCHAR(8)), 112), DATEADD( day, - 1, CONVERT(DATETIME, CAST(T3.FromDate AS VARCHAR(8)), 112) ) ) <= 0 
            THEN
                'Current'
            WHEN
                DATEDIFF( day, CONVERT(DATETIME, CAST(T1.DueDate AS VARCHAR(8)), 112), DATEADD( day, - 1, CONVERT(DATETIME, CAST(T3.FromDate AS VARCHAR(8)), 112) ) ) > 0 
                AND DATEDIFF( day, CONVERT(DATETIME, CAST(T1.DueDate AS VARCHAR(8)), 112), DATEADD( day, - 1, CONVERT(DATETIME, CAST(T3.FromDate AS VARCHAR(8)), 112) ) ) <= 30 
            THEN
                'Late'
        END AS Description

        FROM
            Table1 T1 
            LEFT JOIN
            Table2 T2 
            ON T1.Company = T2.Company 
            AND T1.YR = T2.YR 

            INNER JOIN
            Table3 T3 
            ON T1.Company = T3.Company 
            AND T3.YR = YEAR(CURRENT_DATE)
    )

SELECT      Company, Description, SUM(Amount) AS TotalAmount
FROM        cte
GROUP BY    Company, Description
...