我正在尝试根据与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
第二行和第三行位于“当前”下方。因此,它应该合并两行并添加18000 + 500 =18500。DueDate和Age列仅供参考。最重要的字段是TotalAmount
和Description
我尝试按Description
中使用的别名CASE-WHEN
进行分组,但是没有用。
我将不胜感激。
谢谢!
答案 0 :(得分:0)
您将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