2

正しい結果を返す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

BOOKED_DATEここで、WHERE句に新しいフィールドを追加して、その間隔で作成されたいくつかのプロジェクト タスクのみでプロジェクトの数を制限したいと考えています。したがって、テーブルで INNER JOIN を実行するinner join 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

テーブル PROJECT_TASK の行のために、正しくない巨大な結果が得られます。それを制限する方法は?入れてみ... count(distinct case when ...ましたが、結果は常に1です。

だから私はどういうわけかこの値を制限する必要がありますが、その代わりに私は

4

3 に答える 3

2

あなたはプロジェクトのタスクごとに 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
于 2013-04-12T12:19:23.460 に答える
0

結合テーブル project_task の列「project_id」に重複がある可能性があります

于 2013-04-12T12:23:42.857 に答える
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
于 2013-04-12T12:18:53.207 に答える