带计数的 SQL 案例语句?
Posted
技术标签:
【中文标题】带计数的 SQL 案例语句?【英文标题】:SQL Case statement with Count? 【发布时间】:2021-06-09 18:28:57 【问题描述】:我有一个数据库,允许每人拥有多个种族。不幸的是,我们的答案基本上是“是西班牙裔”、“非西班牙裔”和“未知”,而且有些人确实有多项选择。我需要运行一个大型查询来提取大量信息,其中之一是种族,我想将具有多个选择的那些“转换”为未知。
person_ethnicity_xref 表:
Person_ID | Ethnicity_ID |
---|---|
1234567 | SLWOWQ |
1234567 | ZLKJDU |
mstr_lists 表:
Ethnicity_ID | Ethnicity |
---|---|
SLWOWQ | Hispanic |
ZLKJDU | Not Hispanic |
我一直在努力解决这个问题,因为我不能将 For XML Path 与两个表一起使用,所以我现在尝试使用以下逻辑 案子 当 count(ethnicity_ID)>1 然后'未知' 其他种族 结束
这就是我所拥有的
select
p.person_nbr,
case
when count(eth1.ethnicity_item_id)>1 then 'Unknown'
else ml1.mstr_list_item_desc
end 'final eth'
from
person_table p
left join person_ethnicity_xref eth1 on p.person_id=eth1.person_id
left join mstr_lists ml1 on eth1.ethnicity_item_id=ml1.mstr_list_item_id
group by
p.person_nbr,
ml1.mstr_list_item_desc
这给了我结果,但是当我检查它们时,具有 >1 的那些没有未知值,并且每个种族的人被列出两次。
这个更大查询的另一部分在 FROM 中有一个子查询,用于计算比赛和一个单独的表连接,仅用于计数 = 1 的那些。然后案例说,如果计算种族的子查询出现 >1,那么 X 否则使用另一个表作为 count=1。因为比赛表也使用了 mstr_list,所以涉及 5 个表(现在我更仔细地查看了第二个 person_id 加入,并且计数和常规表有一个 mstr_list ......我不知道为什么,我的大脑累了,那个计数表不是一个简单的计数,而且还在做其他事情)。这真的是唯一的选择吗?这个查询已经运行了 10 多分钟(它不是在生产环境中运行的!)而且我不想通过复制之前的作者所做的事情来让它变得更糟。
【问题讨论】:
count(distinct eth1.ethnicity_item_id)
?
【参考方案1】:
使用聚合:
select p.person_nbr,
(case when min(ml1.mstr_list_item_desc) = max(ml1.mstr_list_item_desc)
then min(ml1.mstr_list_item_desc)
else 'Unknown'
end) as final_ethnicity
from person_table p left join
person_ethnicity_xref eth1
on p.person_id = eth1.person_id left join
mstr_lists ml1
on eth1.ethnicity_item_id = ml1.mstr_list_item_id
group by p.person_nbr;
注意:这会稍微调整您的逻辑。如果有多个种族并且它们都相同,则使用该值。
【讨论】:
【参考方案2】:我认为如果您从 group by 子句中删除 ml1.mstr_list_item_desc 您的查询将起作用。并使用min(ml1.mstr_list_item_desc)
而不是ml1.mstr_list_item_desc
。
下面的查询可以工作。
select
p.person_nbr,
case
when count(eth1.ethnicity_item_id)>1 then 'Unknown'
else min(ml1.mstr_list_item_desc)
end 'final eth'
from
person_table p
left join person_ethnicity_xref eth1 on p.person_id=eth1.person_id
left join mstr_lists ml1 on eth1.ethnicity_item_id=ml1.mstr_list_item_id
group by
p.person_nbr
DB-FIDDLE 示例:
架构和插入语句:
create table person_table(person_id int,person_nbr varchar(10));
insert into person_table values(1234567,'abc');
insert into person_table values(1234568,'xyz');
create table person_ethnicity_xref (Person_ID int, ethnicity_item_id varchar(50));
insert into person_ethnicity_xref values(1234567, 'SLWOWQ');
insert into person_ethnicity_xref values(1234567, 'ZLKJDU');
insert into person_ethnicity_xref values(1234568, 'ZLKJDU');
create table mstr_lists(mstr_list_item_id varchar(50), mstr_list_item_desc varchar(50));
insert into mstr_lists values('SLWOWQ','Hispanic');
insert into mstr_lists values('ZLKJDU','Not Hispanic');
查询:
select
p.person_nbr,
case
when count(eth1.ethnicity_item_id)1 then 'Unknown'
else min(ml1.mstr_list_item_desc)
end 'final eth'
from
person_table p
left join person_ethnicity_xref eth1 on p.person_id=eth1.person_id
left join mstr_lists ml1 on eth1.ethnicity_item_id=ml1.mstr_list_item_id
group by
p.person_nbr
输出:
person_nbr | final eth |
---|---|
abc | Unknown |
xyz | Not Hispanic |
db
【讨论】:
以上是关于带计数的 SQL 案例语句?的主要内容,如果未能解决你的问题,请参考以下文章