我有两个桌子
表
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)
但是有时候动物有多种条件,所以我想再增加一列,显示是否有条件的动物数量
答案 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);