带计数的 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

dbhere

【讨论】:

以上是关于带计数的 SQL 案例语句?的主要内容,如果未能解决你的问题,请参考以下文章

计数功能和案例

尝试更新包含聚合函数(计数)的选择案例语句时出错

坑到了,EF执行带事物的存储过程

Access VBA中的计数SQL语句

多个语句的 SQL 多次计数赢得不同的列

基于星期几返回计数或空值的 Netezza SQL 语句