4

各プロジェクトに請求された合計時間数を次の形式で表示するクエリを完了しようとしています。

Project Name |  Hours
Project A    |  2
Project B    |  6
Project C    |  8

各プロジェクトに請求される時間数をカウントする2つのSQLクエリがあります。各クエリには異なるJOINがあるため、これが必要です。

たとえば、time_records.parent_type ='Task'の場合、Joinは次のようになります。

INNER JOIN time_records
ON time_records.parent_id = project_objects.id

time_records.parent_type ='Project'の場合、結合は次のようになります。

INNER JOIN time_records
ON projects.id = time_records.parent_id

これらの2つのクエリを1つのテーブルに結合しようとしていますが、問題は、プロジェクトごとに1つの一意の行に結合するのではなく、テーブルがプロジェクトを繰り返すことです(ピボットテーブルの機能と同様)。

これが私の現在のクエリです:

(SELECT projects.name AS expr1
     , sum(time_records.value) AS expr2
FROM
  project_objects
INNER JOIN projects
ON projects.id = project_objects.project_id
INNER JOIN time_records
ON time_records.parent_id = project_objects.id
WHERE
  time_records.parent_type = 'Task' 
GROUP BY 
  projects.name)

UNION ALL

(SELECT projects.name AS expr1
      , sum(time_records.value) as expr2
FROM
   projects
INNER JOIN time_records
ON projects.id = time_records.parent_id
WHERE
  time_records.parent_type = 'Project'
GROUP BY 
  projects.name)

現在の出力は次のとおりです。

Project Name | Hours
Project A | 2
Project B | 6
Project C | 8
Project A | 4

プロジェクトAを1行にして、2行ではなく6時間の値を表示する必要があります。UNION操作を試しましたが、効果がありません。

4

2 に答える 2

1

これを試して、これが機能するかどうかを確認できますか?

SELECT X.expr1, SUM(X.expr2)
FROM 
  (SELECT 
    projects.name AS expr1
    , sum(time_records.value) AS expr2
  FROM project_objects
  INNER JOIN projects
    ON projects.id = project_objects.project_id
  INNER JOIN time_records
    ON time_records.parent_id = project_objects.id
  WHERE time_records.parent_type = 'Task' 
  GROUP BY projects.name

  UNION

  SELECT 
    projects.name AS expr1
    , sum(time_records.value) as expr2
  FROM projects
  INNER JOIN time_records
    ON projects.id = time_records.parent_id
  WHERE time_records.parent_type = 'Project'
  GROUP BY projects.name) X
GROUP BY X.expr1
于 2012-10-03T04:12:59.873 に答える
0

OR条件を使用して接続します

編集:

これをチェックしてください:これはあなたのために働く可能性が最も高いです。 2つのselectステートメントの結果を合計する

SELECT projects.name AS nameval
     , sum(time_records.value) AS total
FROM ((SELECT projects.name AS expr1
     , sum(time_records.value) AS expr2
FROM
  project_objects
INNER JOIN projects
ON projects.id = project_objects.project_id
INNER JOIN time_records
ON time_records.parent_id = project_objects.id
WHERE
  time_records.parent_type = 'Task' 
GROUP BY 
  projects.name)

UNION ALL

(SELECT projects.name AS expr1
      , sum(time_records.value) as expr2
FROM
   projects
INNER JOIN time_records
ON projects.id = time_records.parent_id
WHERE
  time_records.parent_type = 'Project'
GROUP BY 
  projects.name)) t group by expr1
于 2012-10-03T03:45:22.397 に答える