选择多个不同条件的计数,只计数不同,在一行中返回结果
Posted
技术标签:
【中文标题】选择多个不同条件的计数,只计数不同,在一行中返回结果【英文标题】:Select multiple counts with different conditions and only count distinct, returning results in a single row 【发布时间】:2021-06-28 15:21:53 【问题描述】:我已经看到很多关于如何在解决方案类似的同一行中选择多个计数的问题。
SELECT
sum(case when rqbg = 'B' and rxbg = 'G' and rxmid is not null then 1 else 0 end) AS btg_changed,
sum(case when rqbg = 'B' and rbg = 'G' and rxmid is not null then 1 else 0 end) AS btg_possible,
FROM fact
where dt between '2021-04-01' and '2021-04-28'
and sender_account_id = 111111;
我想这样做,但仅在特定参数 rmid
不同时进行总结。
我可以使用UNION ALL
来做到这一点,例如:
SELECT count(DISTINCT rmid) AS "btg_changed"
from fact
where rqbg = 'B'
and rbg = 'G'
and rxmid is not null
and rxbg = 'G'
UNION ALL
SELECT count(DISTINCT rmid) AS "btg_possible"
from fact
where rqbg = 'B'
and rbg = 'G'
and rxmid is not null
这里的问题是,后一种方法实际上并没有使每个值都成为自己的列 - 每个计数都在同一列中。
那么我该如何做到这一点,我只根据rmid
计算不同的行,但我也在自己的列中获取每个计数。最终结果应该只是具有几个不同计数的一行。我还有一些其他问题想问,但为了清楚起见,只包括了两个选择。
我正在使用 Impala。
我还更改了一些列名以混淆我正在处理的内容,如果造成混淆,敬请见谅。
【问题讨论】:
【参考方案1】:只要使用条件:
select count(case when rxbg = 'G' then rmid end) AS btg_changed,
count(distinct rmid) as btg_possible
from fact
where rqbg = 'B' and rbg = 'G' and rxmid is not null
【讨论】:
这离工作太近了。我最终发现``` 选择计数(当 rxbg = 'G' 和 rqbg = 'B' 和 rbg = 'G' 然后 rmid 结束时的不同情况)AS btg_changed,计数(当 rqbg = 'B' 和 rbg 时的不同情况= 'G' then rtpb_msg_id end) as btg_possible from fact where rxmid is not null ```完美运行。谢谢你。我不得不将条件保留在外面,因为我有更多的计数。 @aaaaaaaaaron_g 。 . .case
表达式中有多余的条件。这个答案在WHERE
中重构了它们,这应该会使查询更有效率。
谢谢,我的意思是它不是多余的,因为我需要计算很多其他不具备这些条件的东西。
@aaaaaaaaaron_g 。 . .您重构where
中的常见条件,然后将case
用于计数中的各个条件。此版本与您的 union all
版本完全对应(尽管这可能不等同于您的第一个查询)。以上是关于选择多个不同条件的计数,只计数不同,在一行中返回结果的主要内容,如果未能解决你的问题,请参考以下文章