【问题标题】:SQL Aggregate records by CASE WHENSQL 按 CASE WHEN 聚合记录
【发布时间】:2020-08-23 02:40:15
【问题描述】:

我正在尝试根据与 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

但是,我真正想要完成的是聚合记录,如果它们具有相同的Description 值。 所以,正确的结果应该是:

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

第 2 行和第 3 行属于“当前”。因此,它应该合并 2 行并添加 18000 + 500 = 18500。DueDate 和 Age 列仅供参考。最重要的字段是TotalAmountDescription

我尝试按CASE-WHEN 中使用的别名Description 进行分组,但没有成功。

如果有任何帮助,我将不胜感激。

谢谢!

【问题讨论】:

  • 这个查询必须在 MySQL 中运行,因为它应该引发几个错误!请标记您的 DBMS。
  • @Parfait:它看起来像 SQL Server.. 除了使用 current_date
  • table2 上的left join 有什么意义,而查询中的任何地方似乎都没有使用此表?
  • @GMB,我也是这么认为的,但是 SQL Server 会引发 description 的错误,并且可能会引发 Age 错误(如果不是由 DueDateFromDate) 不在GROUP BY 子句中。 OP 可能在发布时删除了太多代码。
  • @jordan,请标记您的 RDBMS 并注意其版本(MySQL 8+ 支持 CTE)。并重新检查您的 GROUP BY 子句。你的prior question 表示mysql

标签: sql group-by aggregate-functions case-when


【解决方案1】:

您将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

【讨论】:

  • 谢谢。我尝试将case 语句复制并粘贴到group by,但它只改变了记录的顺序,但没有结合第二行和第三行。我正在为 datalake 执行此操作,我认为 cte 不受支持。
  • 你把Due DateAgeGROUP BY子句中去掉了吗?
  • 这次成功了!它希望CASE 两个语句都出现在GROUP-BY 中,否则它将不起作用。非常感谢!我现在可以睡觉了。
  • 明天我会用答案更新问题详情。我选择你的答案是最好的答案。感谢您的帮助。
猜你喜欢
  • 2018-04-21
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 2019-10-16
  • 2019-01-16
  • 2017-05-30
相关资源
最近更新 更多