Объедините две таблицы для одного вывода

StackOverflow https://stackoverflow.com/questions/1227835

  •  22-07-2019
  •  | 
  •  

Вопрос

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

Известные часы:

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

Неизвестные часы:

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.Я обновил примеры данных, чтобы отразить это.

Это было полезно?

Решение

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top