web-dev-qa-db-ja.com

1つの出力に2つのテーブルを組み合わせる

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の組み合わせの時間を合計する必要があります。これを反映するようにサンプルデータを更新しました。

46
Matthew Jones

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つのクエリを個別に実行するよりも遅くなりません。

81
lc.

予想される出力では、最後の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
11
BenAlabaster

これをさらに一歩進めて、結合したときに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

しかし、これは両方のテーブルの時間の合計を与えるものではありません...

1