5

会社 A の一連の目標と総労働時間を取得するために正しく機能するクエリがあります。会社 B に対してまったく同じクエリを実行し、たまたま週ごとにグループ化された共通の日付にそれらを結合したいと考えています。私の現在のクエリ:

SELECT * FROM (
  SELECT org, date,
         ( SELECT SUM( target ) FROM target WHERE org = "companyA" ) AS companyA_target,
         SUM( hours ) AS companyA_actual
  FROM time_management_system
  WHERE org = "companyA"
  GROUP BY WEEK( date )
  ORDER BY DATE
) q1

LEFT JOIN (
  SELECT org, date,
         ( SELECT SUM( target ) FROM target WHERE org = "companyB" ) AS companyB_target,
         SUM( hours ) AS companyB_actual
  FROM time_management_system
  WHERE org = "companyB"
  GROUP BY WEEK( date )
  ORDER BY DATE
) q2 

ON q1.date = q2.date

結果には、companyA のすべての日付/情報が表示されますが、companyB は散発的なデータのみを示しています。別々に、2 つのクエリはまったく同じ一連の日付を表示しますが、'target' 列と 'actual' 列の情報が異なります。

companyA    2012-01-28  105.00  39.00   NULL      NULL          NULL   NULL 
companyA    2012-02-05  105.00  15.00   NULL      NULL          NULL   NULL
companyA    2012-02-13  105.00  60.50   companyB  2012-02-13    97.50  117.50

companyB のすべての情報が得られない理由は何ですか?

補足として、各行の週の値を列に変換する方向を指摘できる人はいますか? companyA と companyB が 2 つの行だけですか?

私はすべての助けに感謝します! ありがとう。

4

2 に答える 2

1

ターゲット テーブルに明確な日付がない場合、合計はすべての週で一定になります。そのため、会社 A と B の「org」値のみに対して、group by を使用して事前クエリを実行しました。これにより、「組織」ごとに 1 つのレコードのみが保証されるため、デカルトの結果は得られません。

次に、両方の会社に対して time_management_system ONCE を照会しています。フィールド計算内で、IF() を適用して会社の値をテストし、正しい場合に適用しています。WEEKの活動はどちらも最終結果は同じなので、別々に行って参加する必要はありません。これにより、日付列を 2 回表示する必要もなくなります。また、最終的な列名がそれを反映しているため、組織の列名を明示的に追加する必要もありません。

SELECT
      WEEK( tms.date ) as GrpWeek,
      IF( tms.org = "companyA", TargetSum.CompTarget, 00000.00 )) as CompanyATarget,
      SUM( IF( tms.org = "companyA", tms.hours, 0000.00 )) as CompanyAHours,
      IF( tms.org = "companyB", TargetSum.CompTarget, 00000.00 )) as CompanyBTarget,
      SUM( IF( tms.org = "companyB", tms.hours, 000.00 )) as CompanyBHours
   from
      Time_Management_System tms
         JOIN ( select 
                      t.org,
                      SUM( t.target ) as CompTarget
                   from 
                      Target T
                   where
                      t.org in ( "companyA", "companyB" ) 
                   group by
                      t.org ) as TargetSums
            ON tms.org = TargetSums.org
   where 
      tms.org in ( "companyA", "companyB" )
   group by
      WEEK( tms.date )
   order by
      WEEK( tms.date )
于 2012-04-27T23:35:29.573 に答える
1

あなたのサブクエリは両方とも間違っています。

あなたがこれを望むか:

SELECT 
org,
WEEK(date),
( SELECT SUM( target ) FROM target WHERE org = "companyB" ) AS companyB_target,
SUM( hours ) AS companyB_actual
FROM time_management_system
WHERE org = "companyB"
GROUP BY WEEK( date )

または、これが必要です:

SELECT 
org,
date,
( SELECT SUM( target ) FROM target WHERE org = "companyB" ) AS companyB_target,
SUM( hours ) AS companyB_actual
FROM time_management_system
WHERE org = "companyB"
GROUP BY date

現在行っている方法は、正しく形成された SQL ではありません。他のほとんどのデータベースでは、クエリはすぐにエラーで失敗します。MySQL はより緩く、クエリを実行しますが、結果は不確定です。

于 2012-04-27T21:23:52.930 に答える