Объединить две таблицы для одного вывода - PullRequest
45 голосов
/ 04 августа 2009

Скажем, у меня есть две таблицы:

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

Мне нужно сгруппировать эти часы, игнорируя Месяц, в одну таблицу данных, чтобы мой ожидаемый результат был следующим:

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

Я не могу понять это. Любая помощь будет принята с благодарностью!

РЕДАКТИРОВАТЬ: мне нужно суммировать часы для каждой комбинации ChargeNum / Category. Я обновил пример данных, чтобы отразить это.

Ответы [ 3 ]

78 голосов
/ 04 августа 2009

Вам нужно будет использовать 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, как указано выше, это не медленнее, чем выполнение двух запросов по отдельности, поскольку не выполняется проверка дубликатов.

11 голосов
/ 04 августа 2009

В ожидаемом результате вы получили неверную сумму второй последней строки, она должна составлять 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
1 голос
/ 30 марта 2017

Можем ли мы сделать еще один шаг вперед и сказать, что я хочу видеть только строки, объединенные, которые имеют 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

Но это не дает сумму часов в обеих таблицах ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...