[英]SQL - combining DISTINCT and INNER JOIN and COUNT(CASE WHEN)
我有返回正确结果的SQL。
select accounts.name, count( case when ((( estimated_start_date<='2013-01-01'
and project.status='closed')
or ( estimated_start_date<='2013-01-01' and project.status='open'
and estimated_end_date>='2013-04-01')))
then 1 else null end) as Number
from project
inner join project_cstm on project.id=project_cstm.id_c
inner join accounts on project_cstm.account_id_c=accounts.id
group by accounts.name
我还给我很好的结果:
例如:
Telenor 5
Telecom 3
现在,我想在WHERE
子句中添加新字段BOOKED_DATE
,以仅限制在该间隔内创建的某些项目任务的项目数。 因此,我使用表inner join project_task
联接inner join project_task
进行了INNER JOIN,结果应该更小了,但是结果却是这些巨大的数字。不知道如何将其组合起来。
感谢帮助
Telenor 150
Telecom 980
select accounts.name, count( case when ((( estimated_start_date<='2013-01-01'
and project.status='closed')
or ( estimated_start_date<='2013-01-01' and project.status='open'
and estimated_end_date>='2013-04-01')))
then 1 else null end) as Number
from project
inner join project_cstm on project.id=project_cstm.id_c
inner join accounts on project_cstm.account_id_c=accounts.id
inner join project_task on project_task.project_id=project.id
where booked_date>'2013-01-01' and booked_date<'2015-01-01'
group by accounts.name
由于表PROJECT_TASK中的行,我得到的巨大结果远不正确。 如何限制呢? 我试着把... count(distinct case when ...
但是结果总是1。
所以我必须以某种方式限制此值,但我不是
您为项目的每个任务都计为1,这就是为什么您拥有这么多的原因。
对于每个项目,您只需要增加一次计数即可。
您要计算不同的项目,因此要计算不同的项目ID,而不是仅计算1:
select accounts.name
, count( distinct -- here distinct
case when ((( estimated_start_date<='2013-01-01' and project.status='closed')
or ( estimated_start_date<='2013-01-01' and project.status='open' and estimated_end_date>='2013-04-01')))
then project.id -- here project id
else null
end) as Number
from project
inner join project_cstm
on project.id=project_cstm.id_c
inner join accounts
on project_cstm.account_id_c=accounts.id
inner join project_task
on project_task.project_id=project.id
where booked_date>'2013-01-01'
and booked_date<'2015-01-01'
group by accounts.name
我无法测试您的查询,但我认为您应该使用类似以下的内容:
select accounts.name, count(DISTINCT project.id) as Number
from project
inner join project_cstm on project.id=project_cstm.id_c
inner join accounts on project_cstm.account_id_c=accounts.id
inner join project_task on project_task.project_id=project.id
where
(booked_date>'2013-01-01' and booked_date<'2015-01-01')
AND ((estimated_start_date<='2013-01-01' and project.status='closed')
OR
(estimated_start_date<='2013-01-01'
and project.status='open'
and estimated_end_date>='2013-04-01'))
group by accounts.name
您的联接表project_task的“ project_id”列中可能有重复项
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.