处理日期时对大小写表达式求和



我希望创建一个视图,该视图将以以下格式输出数据

AgedPeriod   BillValue  Status
<1            35000     Outstanding 
1-3           23386     Outstanding 
3-6           5000      Outstanding

我可以使用下面的代码将每个case语句求和到一个新列中,并且我可以在上面列出的AgedPeriod之后命名列标题,但是即使SUMS是正确的,格式是错误的,我也希望将下面的代码嵌套在另一个case语句中,该语句不必由b.BILL_DATE分组,因为与账单日期分组违背了SUM的目的。所有使用另一个CASE语句的尝试总是将b.BILL_DATESUM中取出,并进入要求将其分组的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 ?我可以处理状态列(那里不需要建议)

我添加了一个表和一些示例数据,并留下了一个查询,以显示我希望如何拆分数据,但它希望它被格式化为上述(在列中)

Sql Fiddle示例

谢谢

您需要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子句。
  • 我增加了一个超过六个月的额外条件。似乎你不想忽略这些。
  • 我不知道最后一栏应该是什么。

您可以使用subqueryCTE来执行case when语句,然后连接回基表以获取未完成列的,如下所示:

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演示:

SQL Fiddle解决方案演示

最新更新