如何解决查询以显示不同的组合,然后显示每个不同组合的计数
此表中存在多个transid字段,其中包含配置值列表。对于所有的transid,我想按计数检索表组中存在的transid,config_name和value字段的所有不同组合
我有联接查询,该查询未按预期返回结果。下面是表结构,使用的查询,结果和预期结果
表
transid config_name value
1 payment_fee instant
2 eligible_account true
1 Block_intl_trans false
5 payment_fee provider_charge
1 eligible_account false
1 KycEligible 0
2 KycEligible 1
5 KycEligible 1
5 Block_intl_trans true
2 Block_intl_trans false
2 payment_fee provider_charge
5 eligible_account true
上面的表结构意味着下面是每个用户的配置值的组合。
transid KycEligible payment_fee eligible_account Block_intl_trans
1 0 instant false false
2 1 provider_charge true false
5 1 provider_charge true false
下面是我用来将行转换为列然后按config_name分组的查询(对于每个config_name,而不是每个config键和值组合的多行)。然后选择表中存在的KycEligible,配置名称和值组合的所有不同组合以及每个不同组合的计数。
select
distinct
max(case when b.config_name = 'KycEligible' then b.config_value end) KycEligible,max(case when b.config_name = 'payment_fee' then b.config_value end) payment_fee,max(case when b.config_name = 'eligible_account' then b.config_value end) eligible_account,max(case when b.config_name = 'Block_intl_trans' then b.config_value end) Block_intl_trans,count(*) AS COUNT
from tableA b
where b.config_name in ('KycEligible','payment_fee','eligible_account','Block_intl_trans')
group by b.config_name
having count(*) > 1
预期结果:
KycEligible payment_fee eligible_account Block_intl_trans Count
0 instant false false 1
1 provider_charge true false 2
我的查询未返回预期结果。有人可以帮忙这个查询吗?
解决方法
我认为您需要这样的东西:
stdout
这将给出以下内容:
SELECT
KycEligible,payment_fee,eligible_account,Block_intl_trans,COUNT(*) CNT
FROM (
SELECT
(SELECT MAX(t0.config_value) FROM test t0 WHERE t0.config_name = 'KycEligible' AND t0.transid = t.transid) as KycEligible,(SELECT MAX(t0.config_value) FROM test t0 WHERE t0.config_name = 'payment_fee' AND t0.transid = t.transid) as payment_fee,(SELECT MAX(t0.config_value) FROM test t0 WHERE t0.config_name = 'eligible_account' AND t0.transid = t.transid) as eligible_account,(SELECT MAX(t0.config_value) FROM test t0 WHERE t0.config_name = 'Block_intl_trans' AND t0.transid = t.transid) as Block_intl_trans
FROM
test t
GROUP BY t.transid
) dt
GROUP BY KycEligible,Block_intl_trans
;
结果与预期的不同之处在于:
ycEligible payment_fee eligible_account Block_intl_trans CNT
0 instant○ false false 1
1 provider_charge true false 1
1 provider_charge true true 1
,
我提供两个小提琴示例,因为您提供的示例数据不一致。
- 此小提琴用于transid = 5,其中
Block_intl_trans
的数据为true
-与您的表数据示例一致:https://www.db-fiddle.com/f/r1imsYP8dQxkLSo5SkYcVK/3 - 此小提琴用于transid = 5,其中
Block_intl_trans
的数据为false
-与您说明的配置组合一致:https://www.db-fiddle.com/f/r1imsYP8dQxkLSo5SkYcVK/4
我猜测唯一的组合将来自所有config_name
值。这是查询示例:
SELECT KycEligible,COUNT(*) FROM
(SELECT transid,GROUP_CONCAT(CASE WHEN config_name="KycEligible" THEN config_value END) AS "KycEligible",GROUP_CONCAT(CASE WHEN config_name="payment_fee" THEN config_value END) AS "payment_fee",GROUP_CONCAT(CASE WHEN config_name="eligible_account" THEN config_value END) AS "eligible_account",GROUP_CONCAT(CASE WHEN config_name="Block_intl_trans" THEN config_value END) AS "Block_intl_trans"
FROM TableA
GROUP BY transid) V
GROUP BY KycEligible,Block_intl_trans;
,
使用Max的简单查询,
计算结果可以基于您的输入数据(transid = 5,config = Block_intl_trans,value = false或value = true)
SELECT KycEligible,COUNT(*) FROM
(
SELECT
transid,max(CASE WHEN config_name="KycEligible" THEN value END) AS "KycEligible",max(CASE WHEN config_name="payment_fee" THEN value END) AS "payment_fee",max(CASE WHEN config_name="eligible_account" THEN value END) AS "eligible_account",max(CASE WHEN config_name="Block_intl_trans" THEN value END) AS "Block_intl_trans"
FROM <YOUR_TABLE_NAME>
GROUP BY transid
) tmp
GROUP BY KycEligible,Block_intl_trans;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。