计算表是否满足一个或多个条件SQL

时间:2020-07-30 21:11:55

标签: sql count case

我有两个桌子

AnimalID | Date

表2

AnimalID | ConditionID

AnimalID是Table的主键,其中包括动物的出生日期。

表2列出了该动物的AnimalID和任何疾病ConditionID。结果,AnimalID可能在Table2中多次出现。我想知道条件79、80、1000和90。

SELECT        DATEPART(year, Table.Date) AS x_Year,
                COUNT(Distinct Table.AnimalID) AS N_Killed,
                COUNT(CASE WHEN Table2.ConditionId =79 THEN 1 END) AS Col1,
                COUNT(CASE WHEN Table2.ConditionId =80 THEN 1 END) AS Col2,
                COUNT(CASE WHEN Table2.ConditionId =1000 THEN 1 END) AS Col3,
                COUNT(CASE WHEN Table2.ConditionId =90 THEN 1 END) AS Col4
FROM            Table LEFT JOIN
                         Table2 ON Table.AnimalID = Table2.AnimalID

GROUP BY DATEPART(year, Date)
ORDER BY DATEPART(year, Date)

但是有时候动物有多种条件,所以我想再增加一列,显示是否有条件的动物数量

2 个答案:

答案 0 :(得分:0)

基本上,您想要执行的操作与使用N_Killed所做的相同,但仅当动物生病时才这样做。 Col4只是在输入AnimalID时才有条件,因此通过使用唯一性来计数唯一的AnimalId,即可获得所需的信息。

SELECT        DATEPART(year, Table.Date) AS x_Year,
                COUNT(Distinct Table.AnimalID) AS N_Killed,
                COUNT(CASE WHEN Table2.ConditionId =79 THEN 1 END) AS Col1,
                COUNT(CASE WHEN Table2.ConditionId =80 THEN 1 END) AS Col2,
                COUNT(CASE WHEN Table2.ConditionId =1000 THEN 1 END) AS Col3,
                COUNT(Distnict CASE WHEN Table2.ConditionId is not null THEN Table.AnimalID END) AS Col4,
FROM            Table LEFT JOIN
                         Table2 ON Table.AnimalID = Table2.AnimalID

GROUP BY DATEPART(year, Date)
ORDER BY DATEPART(year, Date)

答案 1 :(得分:0)

我希望您在所有聚合中都使用distinct,因为您不想对同一只动物进行两次计数。要获得具有任何上述条件的动物的数量,只需使用in

select datepart(year, a.date) as x_year,
       count(distinct a.animalid) as n_killed,
       count(distinct case when b.conditionid = 79 then a.animalid end) as col1,
       count(distinct case when b.conditionid = 80 then a.animalid end) as col2,
       count(distinct case when b.conditionid = 1000 then a.animalid end) as col3,
       count(distinct case when b.conditionid = 90 then a.animalid end) as col4,
       count(distinct case when b.conditionid in ('79','80','1000',90') then a.animalid end) as col5
from  table a 
left join table2 b on a.animalid = b.animalid
group by datepart(year, a.date)
order by datepart(year, a.date);