我想做一个相当复杂的 SELECT 我将推广的计算:

  1. 主要查询是一张桌子的通配符选择
  2. 一个子查询做一个 COUNT() 在所有基于条件的项目中(这很好)
  3. 另一个子查询 SUM() 基于另一个条件的列中的数字。这也可以正常工作,除非没有记录符合条件,否则它将返回 NULL.

我最初想加总两个子征服 (subquery1)+(subquery2) AS total 除非subquery2为null,在这种情况下,哪个工作正常 total 不管subquery1的结果是什么。我的第二个想法是尝试创建第三列,该列是对两个子征服的计算(即, (subquery1) AS count1, (subquery2) AS count2, count1+count2 AS total)但是我认为无法计算两个计算的列,即使是,我也觉得同样的问题也适用。

在获得两个子查询价值并将其总计在我的程序中的情况下,有没有人能解决此问题的优雅解决方案?

谢谢!

有帮助吗?

解决方案

这里有两个问题:

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

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

  • 你不能用null做算术,因为 空不是零.

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

这是一个例子:

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

(请记住,在此示例中必须给出一个派生的表格别名,“ t”)

其他提示

首先,结合功能应帮助您解决任何无效问题。

您能否使用联盟将这两个查询合并为单个结果集,然后将其视为进一步分析的子查询?

也许我不完全理解您的问题?

我会尝试(对于第二个查询)类似:select sum(isnull(mycolumn,0))//请在使用之前验证语法,但是...

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

可能没有必要说,但是由于您在程序中使用它,因此您宁愿使用程序逻辑来总和两个结果(null和一个数字),这是由于便携性问题。

谁知道何时拒绝结合功能或其他DBMS是否支持它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top