2013-04-12 100 views
1

我有SQL,它会返回正确的结果。SQL - 结合DISTINCT和INNER JOIN和COUNT(CASE WHEN)

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和结果应该更小,但相反,我得到的结果这些巨大的数字。不知道如何将它结合起来。

感谢,因为在表PROJECT_TASK行求助

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 

我得到它远离正确的巨大成果。如何限制?我试图把... count(distinct case when ...但比结果始终是1

所以我必须以某种方式限制此值,但不是说我

回答

0

您正在为您的项目的每个任务计数1,这就是为什么你有这么多。
对于每个项目,您只需要增加1次计数。

你要算独特谟,因此,而不是只算1的,算上不同项目的ID:

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 
+0

谢谢。我非常亲密,但没有你我就无法做到。祝一切顺利 –

0

我无法测试您的查询,但我认为你应该使用这样的事情:

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 
0

您的加盟表project_task可能有重复列“PROJECT_ID”