sql - SQl 从多个 CTE 中获取计数到一个表中
问题描述
我有多个 CTE,它们都来自同一个表“table1”。他们返回的只是行数。每个 CTE 之间的差异是 where 语句的内容,因为我想在进行这些小的更改时比较计数。代码如下所示:
WITH cte1 AS(
SELECT COUNT(*)
FROM table1
WHERE....
), cte2 AS(
SELECT COUNT(*)
FROM table1
WHERE....
), cte3 AS(
SELECT COUNT(*)
FROM table 1
WHERE....
)
我想得到一个输出,我从每个 CTE 中获取所有计数,并将它们放在一个表中,例如:
cte1 cte2 cte3
1,564 3,567 2,861
解决方案
只要您的所有 CTE 仅返回 1 行,您就可以对所有 CTE 进行笛卡尔积(全部在 from 子句中,没有连接)。我相信您需要为您的 count(*) 表达式提供一个列别名,以将它们也包含在您的 CTE 中。
WITH cte1 AS(
SELECT COUNT(*) cnt
FROM table1
WHERE....
), cte2 AS(
SELECT COUNT(*) cnt
FROM table1
WHERE....
), cte3 AS(
SELECT COUNT(*) cnt
FROM table 1
WHERE....
)
SELECT cte1.cnt AS cte1, cte2.cnt AS cte2, cte3.cnt AS cte3
FROM cte1, cte2, cte3
此外,如果您的 CTE 中没有任何联接,则可以使用 sum case 表达式同时运行计数,这可能会提高性能。
SELECT SUM(CASE WHEN /* where clause 1 */ THEN 1 ELSE 0 END) cte1,
SUM(CASE WHEN /* where clause 2 */ THEN 1 ELSE 0 END) cte2,
SUM(CASE WHEN /* where clause 3 */ THEN 1 ELSE 0 END) cte3
FROM table1
推荐阅读
- ruby-on-rails - 第一次尝试安装 rails 时出现错误。我在 macOS High Sierra
- html - 缩小窗口大小时防止家谱破裂
- java - Tomcat 8.5 内存
- c# - 在 SSMS 中快速查询,但在 C# 应用程序中运行缓慢/无法运行
- c# - 仅在最后一级的组摘要
- javascript - Node.Js 相同代码的不同输出异步
- math - Gnuplot 计算错误的函数
- python - 有没有办法在决策树分类器中同时获得每个类的预测概率以及每个类的标签?
- ssrs-2016 - SSRS 2016 中的固定位置矩形
- android - Android App bundle 找不到资源的符号变量