处理日期时求和 case 表达式
Sum on case expression when working with dates
我想创建一个视图,它将以下列格式输出数据
AgedPeriod BillValue Status
<1 35000 Outstanding
1-3 23386 Outstanding
3-6 5000 Outstanding
我可以使用下面的代码将每个 case 语句求和到一个新列中,我可以在上面列出的 AgedPeriod 之后命名列标题,但即使 SUMS
是正确的,格式也是错误的,我想将下面的代码嵌套在另一个不必按 b.BILL_DATE
分组的 CASE 语句中,因为与账单日期分组违背了我的 SUM 的目的。使用另一个 CASE 语句的所有尝试总是将 b.BILL_DATE
带出 SUM
并进入要求将其分组的 WHEN 条件。
SELECT
SUM(CASE WHEN (b.BILL_DATE <= GetDate()
AND b.BILL_DATE >= DateAdd(mm,-1, GetDate()))
THEN b.OUTSTANDING END),
SUM(CASE WHEN (b.BILL_DATE <= DateAdd(mm,-1, GetDate())
AND b.BILL_DATE >= DateAdd(mm,-3, GetDate()))
THEN b.OUTSTANDING END),
SUM(CASE WHEN (b.BILL_DATE <= DateAdd(mm,-3, GetDate())
AND b.BILL_DATE >= DateAdd(mm,-6, GetDate()))
THEN b.OUTSTANDING END)
FROM dbo.Tables
我知道这可能无法通过我目前采取的路线实现,但有没有其他方法可以 SUM
每个时间段的未清金额?我可以处理状态栏(那里不需要建议)
我添加了一个 table 和一些示例数据,并留下了一个查询来显示我希望如何拆分数据,但它希望它的格式如上(在一列中)
谢谢
您需要 group by
而不是条件聚合。你想要的查询是这样的:
SELECT (CASE WHEN b.BILL_DATE >= DateAdd(month,-1, GetDate())
THEN '<1'
WHEN b.BILL_DATE >= DateAdd(month, -3, GetDate())
THEN '1-3'
WHEN b.BILL_DATE >= DateAdd(month, -6, GetDate())
THEN '3-6'
ELSE '6+'
END) as AgedPeriod,
SUM(Outstanding)
FROM dbo.Tables b
WHERE b.BILL_DATE <= GetDate()
GROUP BY (CASE WHEN b.BILL_DATE >= DateAdd(month,-1, GetDate())
THEN '<1'
WHEN b.BILL_DATE >= DateAdd(month, -3, GetDate())
THEN '1-3'
WHEN b.BILL_DATE >= DateAdd(month, -6, GetDate())
THEN '3-6'
ELSE '6+'
END);
备注:
- 这些组由
CASE
语句定义。因为这是按顺序计算的,所以可以简化逻辑。
- 常见条件
b.BILL_DATE <= GetDate()
移至 WHERE
子句。
- 我添加了超过六个月的额外条件。看来你不想忽略这些。
- 我不知道最后一栏应该是什么。
您可以使用 subquery
或 CTE
来执行 case when 语句,然后返回基础 table 以获得 sum 像这样的优秀专栏:
SELECT a.AgedPeriod
,sum(t1.Outstanding) BillValue
,a.[Status]
FROM dbo.Bill t1
JOIN (
SELECT (
CASE
WHEN b.BILLDATE >= DateAdd(month, - 1, GetDate())
THEN '<1'
WHEN b.BILLDATE >= DateAdd(month, - 3, GetDate())
THEN '1-3'
WHEN b.BILLDATE >= DateAdd(month, - 6, GetDate())
THEN '3-6'
ELSE '6+'
END
) AS AgedPeriod
,b.[ID]
,'Outstanding' [Status]
FROM dbo.Bill b
WHERE b.BILLDATE <= GetDate()
) a ON a.[ID] = t1.[ID]
GROUP BY a.AgedPeriod
,a.[Status]
希望对您有所帮助!这是一个 SQL Fiddle 演示:
我想创建一个视图,它将以下列格式输出数据
AgedPeriod BillValue Status
<1 35000 Outstanding
1-3 23386 Outstanding
3-6 5000 Outstanding
我可以使用下面的代码将每个 case 语句求和到一个新列中,我可以在上面列出的 AgedPeriod 之后命名列标题,但即使 SUMS
是正确的,格式也是错误的,我想将下面的代码嵌套在另一个不必按 b.BILL_DATE
分组的 CASE 语句中,因为与账单日期分组违背了我的 SUM 的目的。使用另一个 CASE 语句的所有尝试总是将 b.BILL_DATE
带出 SUM
并进入要求将其分组的 WHEN 条件。
SELECT
SUM(CASE WHEN (b.BILL_DATE <= GetDate()
AND b.BILL_DATE >= DateAdd(mm,-1, GetDate()))
THEN b.OUTSTANDING END),
SUM(CASE WHEN (b.BILL_DATE <= DateAdd(mm,-1, GetDate())
AND b.BILL_DATE >= DateAdd(mm,-3, GetDate()))
THEN b.OUTSTANDING END),
SUM(CASE WHEN (b.BILL_DATE <= DateAdd(mm,-3, GetDate())
AND b.BILL_DATE >= DateAdd(mm,-6, GetDate()))
THEN b.OUTSTANDING END)
FROM dbo.Tables
我知道这可能无法通过我目前采取的路线实现,但有没有其他方法可以 SUM
每个时间段的未清金额?我可以处理状态栏(那里不需要建议)
我添加了一个 table 和一些示例数据,并留下了一个查询来显示我希望如何拆分数据,但它希望它的格式如上(在一列中)
谢谢
您需要 group by
而不是条件聚合。你想要的查询是这样的:
SELECT (CASE WHEN b.BILL_DATE >= DateAdd(month,-1, GetDate())
THEN '<1'
WHEN b.BILL_DATE >= DateAdd(month, -3, GetDate())
THEN '1-3'
WHEN b.BILL_DATE >= DateAdd(month, -6, GetDate())
THEN '3-6'
ELSE '6+'
END) as AgedPeriod,
SUM(Outstanding)
FROM dbo.Tables b
WHERE b.BILL_DATE <= GetDate()
GROUP BY (CASE WHEN b.BILL_DATE >= DateAdd(month,-1, GetDate())
THEN '<1'
WHEN b.BILL_DATE >= DateAdd(month, -3, GetDate())
THEN '1-3'
WHEN b.BILL_DATE >= DateAdd(month, -6, GetDate())
THEN '3-6'
ELSE '6+'
END);
备注:
- 这些组由
CASE
语句定义。因为这是按顺序计算的,所以可以简化逻辑。 - 常见条件
b.BILL_DATE <= GetDate()
移至WHERE
子句。 - 我添加了超过六个月的额外条件。看来你不想忽略这些。
- 我不知道最后一栏应该是什么。
您可以使用 subquery
或 CTE
来执行 case when 语句,然后返回基础 table 以获得 sum 像这样的优秀专栏:
SELECT a.AgedPeriod
,sum(t1.Outstanding) BillValue
,a.[Status]
FROM dbo.Bill t1
JOIN (
SELECT (
CASE
WHEN b.BILLDATE >= DateAdd(month, - 1, GetDate())
THEN '<1'
WHEN b.BILLDATE >= DateAdd(month, - 3, GetDate())
THEN '1-3'
WHEN b.BILLDATE >= DateAdd(month, - 6, GetDate())
THEN '3-6'
ELSE '6+'
END
) AS AgedPeriod
,b.[ID]
,'Outstanding' [Status]
FROM dbo.Bill b
WHERE b.BILLDATE <= GetDate()
) a ON a.[ID] = t1.[ID]
GROUP BY a.AgedPeriod
,a.[Status]
希望对您有所帮助!这是一个 SQL Fiddle 演示: