Sql server 2008 r2 获取一个组合查询结果集,其中包含来自另一个查询的可能值的计数

Sql server 2008 r2 获取一个组合查询结果集,其中包含来自另一个查询的可能值的计数,sql-server-2008-r2,Sql Server 2008 R2,我有一个场景,我想消除我在页面上执行的查询的数量。假设我有一个结果集,名为filtered_table: SELECT col_a ,col_b ,col_c FROM table where col_a = 1 然后我得到了一组所有可能的结果,如果查询没有被过滤,则为distinct_col_a、distinct_col_b、distinct_col_c SELECT distinct col_a FROM table SE

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

SELECT 
    col_a
    ,col_b
    ,col_c
FROM
    table 
where 
    col_a = 1 
然后我得到了一组所有可能的结果,如果查询没有被过滤,则为distinct_col_a、distinct_col_b、distinct_col_c

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可能包含的每个值,我执行一个查询查询,以获得过滤后的_表中的计数

 (for each value in distinct_col_a)
    SELECT 
        count(col_a)
    FROM
        filtered_table
它很笨重,资源也很丰富。我觉得应该有一些方法来做一个汇总或什么的,而不是为每个人,并得到这些数字都在一次去,但我不能围绕我的头

例如:

桌子

已筛选的表格,使用其中的col_a=1

我想要的结果是:

 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

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

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
结果:

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
注意-这些结果与您期望的输出顺序相同。但目前还没有订单条款,所以不能保证这一点

并不是将WHERE子句应用于CASE表达式中作为检查。如果你不能马上看到它是如何工作的,我建议你跑步

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产生的效果。

我强烈建议您用一些数据做一个具体的例子。这是表格,这是期望的结果。因为这会让你的问题更清晰,让我们更容易帮助你。就目前而言,我有太多的问题,比如你所指的过滤表。明白了,我现在就这么做。
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
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