首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从另一个查询中获取包含可能值计数的组合查询结果集

从另一个查询中获取包含可能值计数的组合查询结果集
EN

Stack Overflow用户
提问于 2019-02-01 00:35:42
回答 1查看 16关注 0票数 0

我有一个场景,我想要消除在页面上执行的查询查询的数量。假设我有一个名为filtered_table的结果集:

代码语言:javascript
运行
复制
SELECT 
    col_a
    ,col_b
    ,col_c
FROM
    table 
where 
    col_a = 1 

然后我得到了一组所有可能的结果,如果查询没有被过滤,distinct_col_a,distinct_col_b,distinct_col_c。

代码语言:javascript
运行
复制
SELECT 
    distinct col_a
FROM
    table

SELECT 
    distinct col_b
FROM
    table

SELECT 
    distinct col_c
FROM
    table

最后,对于distinct_col_a、distinct_col_b、distinct_col_c可能包含的每个值,我执行查询以获得filtered_table中的计数。

代码语言:javascript
运行
复制
 (for each value in distinct_col_a)
    SELECT 
        count(col_a)
    FROM
        filtered_table

它很笨重,而且占用大量资源。我觉得应该有一些方法来做汇总或其他事情,而不是for each,并一次性获得所有这些数字,但我无法理解它。

举个例子:

table

代码语言:javascript
运行
复制
col_a    |    col_b    |    col_c 
1        |    a        |    x
2        |    b        |    y
3        |    c        |    z
3        |    c        |    x
1        |    d        |    x

filtered_table,使用where col_a = 1

代码语言:javascript
运行
复制
   col_a    |    col_b    |    col_c 
    1        |    a        |    x
    1        |    d        |    x

我想要的结果是:

代码语言:javascript
运行
复制
 col_name| col_value| number results
   col_a  |   1      |    2
   col_a  |   2      |    0
   col_a  |   3      |    0
   col_b  |   a      |    1
   col_b  |   b      |    0
   col_b  |   c      |    0
   col_b  |   d      |    1
   col_c  |   x      |    2
   col_c  |   y      |    0
   col_c  |   z      |    0
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-18 16:40:02

我们可以使用unpivot和单独的聚合的时髦组合,在相当紧凑的查询中创建这些结果:

代码语言:javascript
运行
复制
declare @t table (col_a char(1), col_b char(1), col_c char(1))
insert into @t(col_a,col_b,col_c) values
('1','a','x'),
('2','b','y'),
('3','c','z'),
('3','c','x'),
('1','d','x')

select
    col_name, col_value, SUM(Cnt) as results_count
from
    (select *,CASE WHEN col_a = 1 THEN 1 ELSE 0 END as Cnt from @t) t
        unpivot
    (col_value for col_name in (col_a, col_b, col_c)) p
group by col_name,col_value

结果:

代码语言:javascript
运行
复制
col_name  col_value results_count
--------- --------- -------------
col_a     1         2
col_a     2         0
col_a     3         0
col_b     a         1
col_b     b         0
col_b     c         0
col_b     d         1
col_c     x         2
col_c     y         0
col_c     z         0

(注意-这些结果的顺序与您期望的输出顺序相同。但目前没有ORDER BY条款,因此不能保证)

并不是说您将"WHERE子句“应用为CASE表达式中的检查。如果您不能立即看到它是如何工作的,我建议您运行

代码语言:javascript
运行
复制
select
    *
from
    (select *,CASE WHEN col_a = 1 THEN 1 ELSE 0 END as Cnt from @t) t
        unpivot
    (col_value for col_name in (col_a, col_b, col_c)) p

首先看看unpivot产生的效果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54465203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档