SELECT 语句中的 NULL AS OUT

NULL AS OUT in SELECT statements

我正在尝试解决这个练习:

假设每天可以为每个收款点登记任意次数的收款 (inc) 和支出 (out) [即code列为主键],显示一个table,每个采集点的每个运营日期对应一行。 结果集:点数、日期、每天总支出(out)、每天总收入(inc)。 缺失值被视为 NULL。

经过几个小时的努力,我在网上找到了这个解决方案:

SELECT X.POINT,X.DATE,SUM(OUT),SUM(INC) FROM (
    SELECT I.POINT,I.DATE,NULL AS OUT, SUM(I.INC) AS INC FROM INCOME I
    GROUP BY I.POINT,I.DATE
    UNION 
    SELECT O.POINT,O.DATE,SUM(O.OUT) AS OUT , NULL AS INC FROM OUTCOME O
    GROUP BY O.POINT,O.DATE) AS X
GROUP BY POINT,DATE

我试图了解这是如何工作的。我用谷歌搜索了“NULL AS OUT”的所有变体,但找不到任何 explanation/concept。所有结果都指向存储过程,这不是我想的那样。

有人可以向我解释这些带有“AS OUT”的行是如何工作的吗?

SELECT I.POINT,I.DATE,NULL AS OUT, SUM(I.INC) AS INC FROM INCOME I
GROUP BY I.POINT,I.DATE
UNION 
SELECT O.POINT,O.DATE,SUM(O.OUT) AS OUT , NULL AS INC FROM OUTCOME O

左侧 - table 的完整版本 右边结果

out 可能是一个不幸的名字,但除此之外,那里没有什么神奇的东西。
"null" 是 null.
的字面值 “as out”为选定的 null.

分配一个列别名

在句法上,这等同于具有任何其他别名的任何其他文字值,例如 SELECT 'some_varchar_literal' AS some_aliasSELECT 123 AS numeric_alias

复制评论作为答案以将其标记为有效

这是 SQL 服务器还是 mysql。根据我的理解,我认为 out 表示 null 指的是名为 OUT 的列,基本上是列的别名。收入 table 不会有结果,结果 table 不会有收入。因此,在 select 语句中,各自的值都标记为空值(NULL AS OUT & NULL AS INC)。当您对这些列执行聚合时,空值将被忽略。

您可以使用 NULL,因为当您遇到类似的联合语句时,两个 table 之一没有列。在这种情况下,您可以将这个缺失的列创建为虚拟列并在您的代码中使用它。