2013-04-05 4 views
1

У меня возникли проблемы с получением суммы регистрации, где бизнес-код является тем же. Мой код выглядит следующим образом:Группа по сумме

SELECT DISTINCT lb.building_code , lb.bus_code, gl.building_name, gl.bus_name, SUM(gl.enrollment) AS enrollment 
    FROM table1 AS gl 
    RIGHT OUTER JOIN table 2 AS lb ON gl.building_key = lb.building_key 
    where gl.bus_name = 'Business' 
    and gl.year_cd = 2010 
    GROUP BY lb.building_code, lb.bus_code, gl.building_name, gl.bus_name, gl.enrollment 

Токовый выход:

building_code bus_code bus_name  enrollment 
4581    0000  Business A 12 
4581    0000  Business A 13 
4581    0109  Business B 100 
4581    0109  Business B 120 
4581    0209  Business C 130 
4581    0402  Business D 35 

Желаемый результат:

building_code bus_code bus_name  enrollment 
    4581    0000  Business A 25 
    4581    0109  Business B 220 
    4581    0209  Business C 130 
    4581    0402  Business D 35 
+0

К сожалению SQL сервер – Tone

+1

Попробуйте удалить регистрацию с вашего по заявлению группы. – zundarz

+0

Почему у вас есть 'DISTINCT' * и *' GROUP BY'? И почему «ПРАВОЕ СОЕДИНЕНИЕ», когда вы отфильтровываете внешнюю таблицу в предложении 'WHERE', что делает его« INNER JOIN »в любом случае? –

ответ

1

Удалите gl.building_name, gl.enrollment из пункта GROUP BY:

SELECT 
    lb.building_code , 
    lb.bus_code, 
    gl.bus_name, 
    SUM(gl.enrollment) AS enrollment 
FROM table1 AS gl 
RIGHT OUTER JOIN table 2 AS lb ON gl.building_key = lb.building_key 
where gl.bus_name = 'Business' 
    and gl.year_cd = 2010 
GROUP BY lb.building_code, lb.bus_code, gl.bus_name; 
1
SELECT lb.building_code, 
     lb.bus_code, 
     gl.bus_name,  
     SUM(gl.enrollment) AS enrollment 
    FROM table1 AS gl 
    RIGHT OUTER JOIN table 2 AS lb ON gl.building_key = lb.building_key 
    where gl.bus_name = 'Business' 
    and gl.year_cd = 2010 
    GROUP BY lb.building_code, 
      lb.bus_code, 
      gl.bus_name 
0

Я бы рассмотрел две перезаписи. Один из них, если вы подразумеваете, что это внешнее соединение (так что включите строки из таблицы2, которые не входят в таблицу 1), измените порядок, сделайте его левым соединением, переместите предложения where для таблицы1 в предложение join, удалите отчетливые, и удалить не-сгруппированных столбец из группы по:

SELECT lb.building_code, lb.bus_code, gl.building_name, 
    gl.bus_name, SUM(gl.enrollment) AS enrollment 
FROM dbo.table2 AS lb 
LEFT OUTER JOIN dbo.table1 AS gl 
    ON gl.building_key = lb.building_key 
    AND gl.bus_name = 'Business' 
    AND gl.year_cd = 2010 
GROUP BY lb.building_code, lb.bus_code, gl.building_name, gl.bus_name; 

(для подавляющего большинства народа, LEFT JOIN гораздо более интуитивным, чем RIGHT JOIN.)

Если вы действительно не ожидаем имеют любые строки из таблицы 2, которые не указаны в таблице 1, затем не записывайте это как внешнее соединение в первую очередь:

SELECT lb.building_code, lb.bus_code, gl.building_name, 
    gl.bus_name, SUM(gl.enrollment) AS enrollment 
FROM dbo.table2 AS lb 
INNER JOIN dbo.table1 AS gl 
    ON gl.building_key = lb.building_key 
WHERE gl.bus_name = 'Business' 
    AND gl.year_cd = 2010 
GROUP BY lb.building_code, lb.bus_code, gl.building_name, gl.bus_name; 
0

Попробуйте

Поскольку вы используете правое внешнее соединение, так что не забудьте добавить IsNull в функции агрегатора SUM для обработки несовпадающие данные из таблицы 2

SELECT lb.building_code , lb.bus_code, gl.bus_name, SUM(Isnull(gl.enrollment,0)) AS enrollment 
    FROM table1 AS gl 
    RIGHT OUTER JOIN table 2 AS lb ON gl.building_key = lb.building_key 
    where gl.bus_name = 'Business' 
    and gl.year_cd = 2010 
    GROUP BY lb.building_code , lb.bus_code, gl.bus_name 
Смежные вопросы