将两个表合并为一个输出

Mat*_*nes 47 sql union

说我有两张桌子:

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

我需要将这些小时(忽略Month)分组到一个数据表中,以便我的预期结果如下:

ChargeNum    CategoryID     Hours
111111       1              90
111111       2              50
111111       Unknown        110.5
222222       1              40
222222       Unknown        25.5

我似乎无法弄清楚这一点.任何帮助将不胜感激!

编辑:我需要总结每个ChargeNum/Category组合的小时数.我更新了示例数据以反映这一点.

lc.*_*lc. 81

您需要使用它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
Run Code Online (Sandbox Code Playgroud)

注意 - 如果您使用UNION ALL如上所述,它并不比单独运行两个查询慢,因为它没有重复检查.

  • @Matthew:你在哪里听到的?`union all`绝对快. (5认同)
  • 我听说这非常慢。有没有其他方法可以做到这一点? (2认同)
  • 不幸的是我已经进行过这样的对话...http://stackoverflow.com/questions/1209372/sql-design-accounting-for-unknown-values (2认同)
  • 他最初的回答是 UNION,而不是 UNION ALL。这就是我所指的。 (2认同)

Ben*_*ter 11

在您的预期输出中,您的第二行总和不正确,根据表中的数据应该是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
Run Code Online (Sandbox Code Playgroud)

这是输出:

ChargeNum  CategoryId 
---------- ---------- ----------------------
111111     1          40
111111     2          50
111111     Unknown    70
222222     1          40
222222     Unknown    25.5
Run Code Online (Sandbox Code Playgroud)