2つのテーブルがあるとします。
KnownHours:
ChargeNum CategoryID Month Hours 111111 1 2/1/09 10 111111 1 3/1/09 30 111111 1 4/1/09 50 222222 1 3/1/09 40 111111 2 4/1/09 50
UnknownHours:
ChargeNum Month Hours 111111 2/1/09 70 111111 3/1/09 40.5 222222 7/1/09 25.5
予想される結果が次のようになるように、月を無視してこれらの時間を1つのデータテーブルにグループ化する必要があります。
ChargeNum CategoryID Hours 111111 1 90 111111 2 50 111111不明110.5 222222 1 40 222222不明25.5
私はこれを理解できないようです。どんな助けも大歓迎です!
編集:各ChargeNum/Categoryの組み合わせの時間を合計する必要があります。これを反映するようにサンプルデータを更新しました。
2つのクエリの結果を結合するには、UNION
を使用する必要があります。あなたの場合:
SELECT ChargeNum, CategoryID, SUM(Hours)
FROM KnownHours
GROUP BY ChargeNum, CategoryID
UNION ALL
SELECT ChargeNum, 'Unknown' AS CategoryID, SUM(Hours)
FROM UnknownHours
GROUP BY ChargeNum
注-上記のようにUNION ALL
を使用すると、重複チェックを行わないため、2つのクエリを個別に実行するよりも遅くなりません。
予想される出力では、最後の2番目の行の合計が正しくありません。テーブルのデータに応じて40になるはずですが、クエリは次のとおりです。
Select ChargeNum, CategoryId, Sum(Hours)
From (
Select ChargeNum, CategoryId, Hours
From KnownHours
Union
Select ChargeNum, 'Unknown' As CategoryId, Hours
From UnknownHours
) As a
Group By ChargeNum, CategoryId
Order By ChargeNum, CategoryId
出力は次のとおりです。
ChargeNum CategoryId
---------- ---------- ----------------------
111111 1 40
111111 2 50
111111 Unknown 70
222222 1 40
222222 Unknown 25.5
これをさらに一歩進めて、結合したときに50時間以上の行のみを見たいと言うことができますか?これを試してみましたが、SumHoursが見つからないというエラーが表示されました...
Select ChargeNum, CategoryId, Sum(Hours) As SumHours
From (
Select ChargeNum, CategoryId, Hours
From KnownHours
Union
Select ChargeNum, 'Unknown' As CategoryId, Hours
From UnknownHours
) As a
WHERE (SumHours>=50)
Group By ChargeNum, CategoryId
Order By ChargeNum, CategoryId
だから私は試した
Select ChargeNum, CategoryId, Sum(Hours) As SumHours
From (
Select ChargeNum, CategoryId, Hours
From KnownHours
Union
Select ChargeNum, 'Unknown' As CategoryId, Hours
From UnknownHours
) As a
WHERE (Hours>=50)
Group By ChargeNum, CategoryId
Order By ChargeNum, CategoryId
しかし、これは両方のテーブルの時間の合計を与えるものではありません...