4

我正在尝试进行一个相当复杂的SELECT计算,我将对其进行概括:

  1. 主查询是表的通配符选择
  2. 一个子查询COUNT()根据条件执行所有项目中的一项(这很好用)
  3. 另一个子查询SUM()根据另一个条件在列中执行一个数字。这也可以正常工作,除非没有记录满足条件,否则它会返回NULL.

我最初想将两个子查询相加,(subquery1)+(subquery2) AS total除非 subquery2 为 null,否则total无论 subquery1 的结果是什么,它都可以正常工作,在这种情况下变为 null。我的第二个想法是尝试创建第三列来计算两个子查询(即(subquery1) AS count1, (subquery2) AS count2, count1+count2 AS total),但我认为不可能计算两个计算列,即使是这样,我也觉得一样问题适用。

除了获取两个子查询值并将它们汇总到我的程序中之外,有没有人有一个优雅的解决方案来解决这个问题?

谢谢!

4

4 回答 4

11

这里有两个问题:

  • 您不能在同一个 SELECT 列表中的另一个表达式中使用一个列别名。

    但是,您可以在派生表子查询中建立别名并在外部查询中使用它们。

  • 你不能用 NULL 做算术,因为NULL 不是零

    COALESCE()但是,您可以使用该函数将 NULL“默认”为非 NULL 值。此函数返回其第一个非 NULL 参数。

这是一个例子:

SELECT *, count1+count2 AS total
FROM (SELECT *, COALESCE((subquery1), 0) AS count1, 
                COALESCE((subquery2), 0) AS count2 
      FROM ... ) t;

(请记住,必须为派生表指定一个表别名,在本例中为“t”)

于 2009-05-20T19:43:26.200 回答
3

首先,COALESCE 函数应该可以帮助您处理任何空问题。

您是否可以使用联合将这两个查询合并为一个结果集,然后将其视为子查询以进行进一步分析?

或者也许我没有完全理解你的问题?

于 2009-05-20T19:19:36.513 回答
1

我会尝试(对于第二个查询)类似:SELECT SUM(ISNULL(myColumn, 0)) //请在使用它之前验证语法,不过......

对于该列为零的任何实例,这应该返回 0 而不是 null。

于 2009-05-20T19:19:10.277 回答
0

可能没有必要说,但是由于您在程序中使用它,由于可移植性问题,您宁愿使用程序逻辑来对两个结果(NULL 和一个数字)求和。

谁知道 COALESCE 函数何时被弃用,或者另一个 DBMS 是否支持它。

于 2011-02-28T19:35:47.420 回答