基于两个计算列的计算列

4
我试图进行一项相当复杂的SELECT计算,我将其概括如下:
  1. 主查询是表的通配符选择
  2. 一个子查询根据条件对所有项目进行COUNT()(这个可以正常工作)
  3. 另一个子查询根据另一个条件对列中的数字进行SUM()。除了没有记录满足条件时返回NULL之外,它也可以正确地工作。
最初,我想将两个子查询加起来,类似于(subquery1)+(subquery2) AS total,这个方法很好用,除非subquery2为空,在这种情况下,total将变为null,而不管subquery1的结果如何。我的第二个想法是尝试创建第三个列,该列是两个子查询的计算(即(subquery1) AS count1,(subquery2) AS count2,count1+count2 AS total),但我认为不可能计算两个计算列,即使是可能的,我感觉同样的问题仍然存在。
除了在程序中获取两个子查询值并将它们总和以外,是否有人有优雅的解决方案?
谢谢!

你能提供具体的信息吗?比如你创建的一些样例查询。 - Paulo Santos
还要记得使用 COALESCE(SUM(CASE WHEN condition THEN 1 ELSE 0 END),0) 技巧来有条件地计数项:您可以将两个子查询合并为一个,或将它们合并到主查询中。 - araqnid
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”)

太棒了,谢谢。我没有想到可以使用COALESCE(子查询,0)。这是一个很棒的技巧。 - Jason
你还可以将COALESCE()放置在每个子查询中,包装SUM()或COUNT()。两种方法都可以。 - Bill Karwin

3

首先,COALESCE函数可以帮助您解决任何空值问题。

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

或者我可能没有完全理解您的问题?


我不熟悉UNION或COALESCE,尽管我以前见过它们...我认为你的理解是正确的,因为我正在尝试将它们合并成一个结果集。我能做((subquery1)+COALESCE(subquery2))吗?还是怎么样? - Jason
太棒了...COALESCE解决了问题,尽管SQL语句相当长且难以处理,因为我不得不重复SUM()子查询两次(现在3个子查询作为一列,哎呀)。有没有办法在不重复整个子查询的情况下完成这个操作? - Jason
COALESCE(subquery2, 0) - 表示 subquery2 的值,如果为 null,则为 0。 - araqnid
+1 让我找到了正确的方向,尽管 Bill 完成了这项工作。 - Jason

1
我会尝试(对于第二个查询)类似这样的语句:SELECT SUM(ISNULL(myColumn, 0)) //但在使用之前,请验证语法...
这应该返回0,而不是null,对于该列的任何零实例。

0

可能不需要特别说明,但由于您将其用在程序中,最好使用程序逻辑来对两个结果(NULL和数字)求和,以避免可移植性问题。

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


谁知道,当程序逻辑的函数被弃用或其他编程语言是否支持它时会发生什么。 顺便说一句,10年后COALESCE仍未被弃用... - Vitalij

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接