【问题标题】:How to replace an aggregate null value by 0如何将聚合空值替换为 0
【发布时间】:2015-10-09 12:35:41
【问题描述】:

我需要根据用户帐户上的金额计算一个百分比,并按帐户 ID 对数据进行分组。我在计算中计算了每笔使用的付款的总和。一个问题是我还需要显示没有付款的帐户。我的想法是使用 CASE 语句来检查总和是否给出空值或值。当它返回 null 时,我将其替换为 0。

我有以下查询

SELECT 
  DA.ACCOUNT_ID,
  ROUND((1 - ((CASE 
                WHEN SUM(FPP.AMOUNT_IN_DEFAULT_CURRENCY) IS NOT NULL THEN SUM(FPP.AMOUNT_IN_DEFAULT_CURRENCY)
                ELSE 0
            END) / FAT.PERCENTAGE_INDICATOR)) * 100,0)  AS "Percentage"
FROM DIM_ACCOUNT DA
JOIN TRANSACTION_TABLE FAT ON FAT.ACCOUNT_ID = DA.ID 
JOIN PAYMENTS_TABLE FPP ON FPP.ACCOUNT_ID = DA.ID
GROUP BY DA.ACCOUNT_ID

但是当我使用测试数据执行此操作时,它不起作用。该帐户未添加到我的列表中。我的 NULL 处理有问题吗?

当我剥离查询并且只在支付表上求和时,我得到以下输出:

(不带空格)

我怎样才能做到这一点?

【问题讨论】:

  • 查看可能是 SUM(whole case statement ....)
  • 为什么不只是 SUM(COALESCE(MyColumn,0))?无需 CASE 语句。

标签: sql-server null sum aggregate


【解决方案1】:

NULLsum/max/min... 等聚合函数忽略
如果所有列的值都是null,那么它会报错。

Sum(column)不能是null

SELECT sum(t.num) AS sum_val
FROM (
    SELECT null AS num
) t

操作数数据类型 NULL 对求和运算符无效

【讨论】:

    【解决方案2】:

    如果“未付款”是指PAYMENTS_TABLE 中没有相关记录,则使用LEFT JOIN

    SELECT 
      DA.ACCOUNT_ID,
      ROUND((1 - (ISNULL(SUM(FPP.AMOUNT_IN_DEFAULT_CURRENCY), 0) / FAT.PERCENTAGE_INDICATOR)) * 100,0)  AS "Percentage"
    FROM DIM_ACCOUNT DA
    JOIN TRANSACTION_TABLE FAT ON FAT.ACCOUNT_ID = DA.ID 
    LEFT JOIN PAYMENTS_TABLE FPP ON FPP.ACCOUNT_ID = DA.ID
    GROUP BY DA.ACCOUNT_ID;
    

    a INNER JOIN 确实排除了未付款的帐户,因为需要在所有相关表中都有匹配的记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-14
      相关资源
      最近更新 更多