Sql 对新列中的两个计数求和,而不重复代码

Sql 对新列中的两个计数求和,而不重复代码,sql,database,plsql,Sql,Database,Plsql,我有一个可能很愚蠢的问题。 请看查询: select count(a) as A, count(b) as b, count(a)+count(b) as C From X 如何在不重复代码的情况下总结这两列: 比如: select count(a) as A, count(b) as b, A+B as C From X 您可以得到同一个表的两个单独计数,然后得到这些计数的总和,如下面所示 SELECT (SELECT COUNT(a) FROM X )+ (SELECT CO

我有一个可能很愚蠢的问题。 请看查询:

select count(a) as A, count(b) as b, count(a)+count(b) as C
From X
如何在不重复代码的情况下总结这两列: 比如:

select count(a) as A, count(b) as b, A+B as C
From X

您可以得到同一个表的两个单独计数,然后得到这些计数的总和,如下面所示

SELECT
   (SELECT COUNT(a) FROM X )+
   (SELECT COUNT(b) FROM X )
AS C

您可以得到同一个表的两个单独计数,然后得到这些计数的总和,如下面所示

SELECT
   (SELECT COUNT(a) FROM X )+
   (SELECT COUNT(b) FROM X )
AS C

这可以通过使引擎只执行两个聚合函数和一个标量计算来轻松处理。试试这个

SELECT A, B, A + B as C
FROM (
    SELECT COUNT(a) as A, COUNT(b) as B
    FROM X
    ) T

这可以通过使引擎只执行两个聚合函数和一个标量计算来轻松处理。试试这个

SELECT A, B, A + B as C
FROM (
    SELECT COUNT(a) as A, COUNT(b) as B
    FROM X
    ) T

为完整起见,请使用:


为完整起见,请使用:


让我们同意一点:SQL不是一种面向对象的语言。事实上,当我们想到计算机语言时,我们想到的是过程语言(您使用该语言一步一步地描述您希望如何操纵数据)。SQL是声明性的(您描述了所需的结果,系统会解决如何获得它)

当您使用过程语言编程时,您主要关心的是:1)这是获得正确结果的最佳算法吗?2)这些步骤是否正确实现了算法

当您使用声明性语言编程时,您主要关心的是:这是对所需结果的最佳描述吗

在SQL中,您的大部分工作将用于正确形成筛选条件(where子句)和连接条件(on子句上的任何
)。一旦正确地完成了这项工作,您就可以开始聚合和格式化(如果适用的话)

您显示的第一个查询的格式是完美的。您需要A中所有非空值的数量、B中所有非空值的数量以及这两个数量的总和。在某些系统中,您甚至可以使用显示的第二种形式,它只不过是抽象掉
count(x)
文本。这很方便,因为如果必须将计数(x)
更改为总和(x),则只需在一个位置而不是两个位置进行更改,但这不会更改数据的描述,这一点很重要

使用CTE或嵌套查询可能允许您模拟某些系统中不可用的抽象,但要小心进行表面性更改——这些更改不会改变数据的描述。如果您查看两个查询(CTE和子查询)的执行计划,在大多数系统中,它们可能都是相同的。换句话说,你把你的车漆成了不同的颜色,但它仍然是同一辆车

但是,由于现在你需要在4行或5行中用两个不同的步骤来解释最初在一行中只用一个步骤来表达的内容,因此很难为你已经取得了进步的观点辩护。事实上,我敢打赌,你可以想出更多的要点来解释为什么从CTE或子查询开始并将它们更改为原始查询会更好


我不是说你所做的是错的。但在现实世界中,我们通常没有足够的空闲时间来进行严格的装饰性修改。

让我们同意一点:SQL不是一种面向对象的语言。事实上,当我们想到计算机语言时,我们想到的是过程语言(您使用该语言一步一步地描述您希望如何操纵数据)。SQL是声明性的(您描述了所需的结果,系统会解决如何获得它)

当您使用过程语言编程时,您主要关心的是:1)这是获得正确结果的最佳算法吗?2)这些步骤是否正确实现了算法

当您使用声明性语言编程时,您主要关心的是:这是对所需结果的最佳描述吗

在SQL中,您的大部分工作将用于正确形成筛选条件(where子句)和连接条件(on子句上的任何
)。一旦正确地完成了这项工作,您就可以开始聚合和格式化(如果适用的话)

您显示的第一个查询的格式是完美的。您需要A中所有非空值的数量、B中所有非空值的数量以及这两个数量的总和。在某些系统中,您甚至可以使用显示的第二种形式,它只不过是抽象掉
count(x)
文本。这很方便,因为如果必须将计数(x)
更改为总和(x),则只需在一个位置而不是两个位置进行更改,但这不会更改数据的描述,这一点很重要

使用CTE或嵌套查询可能允许您模拟某些系统中不可用的抽象,但要小心进行表面性更改——这些更改不会改变数据的描述。如果您查看两个查询(CTE和子查询)的执行计划,在大多数系统中,它们可能都是相同的。换句话说,你把你的车漆成了不同的颜色,但它仍然是同一辆车

但是,由于现在你需要在4行或5行中用两个不同的步骤来解释最初在一行中只用一个步骤来表达的内容,因此很难为你已经取得了进步的观点辩护。事实上,我敢打赌,你可以想出更多的要点来解释为什么从CTE或子查询开始并将它们更改为原始查询会更好


我不是说你所做的是错的。但在现实世界中,我们通常没有足够的空闲时间来进行严格的装饰性修改。

重复代码、使用子查询或使用CTE。重复代码、使用子查询或使用CTE。是的,我知道,我的第一个代码是l