我正在寻找一个以下列格式输出数据的视图
AgedPeriod BillValue Status
<1 35000 Outstanding
1-3 23386 Outstanding
3-6 5000 Outstanding
我可以使用下面的代码将每个case语句汇总到一个新列中,我可以在上面列出的AgedPeriod之后命名列标题但是即使SUMS
是正确的,格式是错误的我希望有下面的代码嵌套在另一个CASE语句中,该语句不必由b.BILL_DATE
进行GROUPED,因为与该帐单日期的分组会破坏我的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
每个时间段的未付金额吗?我可以处理状态栏(不需要建议)
我添加了一个表和一些示例数据,并留下了一个查询,以显示我希望如何拆分数据但是它希望将其格式化为上面(在一列中)
由于
答案 0 :(得分:0)
您需要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
子句。答案 1 :(得分:0)
您可以使用subquery
或CTE
执行case语句,然后联接回基表以获取未完成列的 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小提琴演示: