簡體   English   中英

SQL-結合DISTINCT和INNER JOIN和COUNT(案例成立)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM