Я пишу панель мониторинга, и мне нужно извлечь некоторые данные из Microsoft SQL Server.
В качестве простого примера у меня есть три таблицы, одна основная таблица категорий и две таблицы, содержащие значения, связанные с таблицей категорий посредством отношения первичного/внешнего ключа (таблицы значений Blue и Green).
Используя Microsoft SQL Sever (t-sql), я хочу суммировать (суммировать) значения в двух таблицах значений, сгруппированных по общей категории, найденной в таблице категорий.
Таблица категорий
CategoryID (PK) | CategoryName
1 | Square
2 | Circle
Синий стол
BlueID (PK) | CategoryID (FK) | BlueValue | BlueMonth | BlueYear
1 | 1 | 10 | 6 | 2012
2 | 1 | 20 | 12 | 2012
3 | 2 | 5 | 6 | 2012
4 | 2 | 9 | 12 | 2012
5 | 1 | 12 | 6 | 2013
6 | 1 | 21 | 12 | 2013
7 | 2 | 4 | 6 | 2013
8 | 2 | 8 | 12 | 2013
Зеленый стол
GreenID (PK)| CategoryID (FK) | GreenValue| GreenMonth| GreenYear
1 | 1 | 3 | 6 | 2012
2 | 1 | 6 | 12 | 2012
3 | 2 | 2 | 6 | 2012
4 | 2 | 7 | 12 | 2012
5 | 1 | 2 | 6 | 2013
6 | 1 | 5 | 12 | 2013
7 | 2 | 4 | 6 | 2013
8 | 2 | 8 | 12 | 2013
Если я использую следующий SQL, я получаю ожидаемые результаты.
SELECT
[Category].[CategoryName],
SUM([Green].[GreenValue]) AS [GreenTotal]
FROM
[Category]
LEFT JOIN
[Green] ON [Category].[CategoryID] = [Green].[CategoryID]
GROUP BY
[Category].[CategoryName]
Полученные результаты:
CategoryName | GreenTotal
Square | 16
Triangle | 21
Однако, если я добавлю таблицу Blue, чтобы попытаться получить общее значение для BlueValue, мой очевидно неверный T-SQL даст мне неожиданные результаты.
SELECT
[Category].[CategoryName],
SUM([Green].[GreenValue]) AS [GreenTotal],
SUM([Blue].[BlueValue]) AS [BlueTotal]
FROM
[Category]
LEFT JOIN
[Green] ON [Category].[CategoryID] = [Green].[CategoryID]
LEFT JOIN
[Blue] ON [Category].[CategoryID] = [Blue].[CategoryID]
GROUP BY
[Category].[CategoryName]
Неверные результаты:
CategoryName | GreenTotal | BlueTotal
Square | 64 | 252
Triangle | 84 | 104
Кажется, что все результаты отличаются в 4 раза, что равно общему количеству строк в каждой таблице значений для каждой категории.
Я стремлюсь увидеть следующие результаты:
CategoryName | GreenTotal | BlueTotal
Square | 16 | 63
Triangle | 21 | 26
Я был бы на седьмом небе от счастья, если бы кто-нибудь мог сказать мне, что я делаю неправильно?
Спасибо, Марк.