获取组合查询结果集,其中包含来自另一个查询的可能值的计数
Get a combined query result set with a count of possible values from another query
我有一个场景,我想消除我在页面上执行的查询的数量。假设我有一个名为 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 可能包含的每个值,我执行查询查询以获取 filtered_table 中的计数。
(for each value in distinct_col_a)
SELECT
count(col_a)
FROM
filtered_table
它很笨重而且占用大量资源。我觉得应该有某种方法可以进行汇总或其他操作,而不是对每个汇总并一次获得所有这些数字,但我无法全神贯注。
举个例子:
table
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
col_a | col_b | col_c
1 | a | x
1 | d | x
我要查找的结果:
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
(注意 - 这些结果的输出顺序与您想要的输出顺序相同。但目前没有 ORDER BY
子句,因此无法保证)
并不是说您将“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
产生的效果。
我有一个场景,我想消除我在页面上执行的查询的数量。假设我有一个名为 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 可能包含的每个值,我执行查询查询以获取 filtered_table 中的计数。
(for each value in distinct_col_a)
SELECT
count(col_a)
FROM
filtered_table
它很笨重而且占用大量资源。我觉得应该有某种方法可以进行汇总或其他操作,而不是对每个汇总并一次获得所有这些数字,但我无法全神贯注。
举个例子:
table
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
col_a | col_b | col_c
1 | a | x
1 | d | x
我要查找的结果:
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
(注意 - 这些结果的输出顺序与您想要的输出顺序相同。但目前没有 ORDER BY
子句,因此无法保证)
并不是说您将“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
产生的效果。