2013-03-24 5 views
1

Я пытаюсь выбрать из объединения двух запросов Объединение двух запросов дает мне сказать 90 000 записей, но когда я выбираю их сумму, это дает мне сказать 89,800 записей , Таким образом, сумма уменьшает количество записей.SUM уменьшает количество записей

Select Site,building,..., 
SUM(PhysicalCount) as PhysicalResult 
From(
    Select Site,building,..., 
    Count(TagID) as PhysicalCount 
    FROM Physical 
    Where <SomeCondition1> 
    Union 
    Select Site,building,..., 
    Count(TagID) as PhysicalCount 
    FROM Physical 
    Where <SomeCondition2> 
) T1 
Group by Site,building,..., 

ответ

2

Во-первых, ваш запрос не имеет смысла, потому что у вас есть в подзапросов в count без соответствующего group by. Это должно вернуть ошибку.

Если вы хотите, чтобы сумма для группы, но не агрегировать группу, а затем использовать оконные функции вместо:

Select Site,building,..., 
     SUM(PhysicalCount) over (partition by site, building) as PhysicalResult 
From(
    Select Site,building,..., 
    Count(TagID) as PhysicalCount 
    FROM Physical 
    Where <SomeCondition1> 
    group by site, building 
    Union 
    Select Site,building,..., 
    Count(TagID) as PhysicalCount 
    FROM Physical 
    Where <SomeCondition2> 
    group by site, building 
    ) T1 

Хотя union удаляет дубликаты, очевидно, есть комбинации площадки и здания, которые имеют разные на счет.

Возможно, ваше намерение на самом деле сделать это:

Select Site, building, Count(TagID) as PhysicalCount 
    FROM Physical 
    Where (<SomeCondition1>) or (<someCondition2) 
    group by site, building; 
2

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

 
site1, building1, ...., 15 
site1, building1, ....., 16 

Вы можете использовать UNION в вашем внутреннем запросе, но эти 2 строки различны, так как отсчет отличается.
Однако, то вы используете GROUP BY в внешнем запросе, группы по территории, здания, .....
Затем эти 2 строки станут одним, и сосчитать будет 31

2

Это то, что вы ожидаете ,

Построить этот простой пример:

CREATE TABLE #X 
(
[Id] VARCHAR(100), 
[Amount] INT 
) 
INSERT INTO #X VALUES 
('michaeljackson',10), 
('jim',20), 
('jill',20), 
('j',30) 

CREATE TABLE #Y 
(
[Id] VARCHAR(100), 
[Amount] INT 
) 
INSERT INTO #Y VALUES 
('michaeljackson',100), 
('jim',200), 
('jill',200), 
('j',300) 

Теперь попробуйте запустить это:

SELECT * FROM #X 
UNION 
SELECT * FROM #Y 

Теперь запустите следующую команду, которая является моделью вашего сценария:

SELECT x.Id, 
    SUM(x.Amount) AS "Aggregate" 
FROM 
    (
    SELECT * FROM #X 
    UNION 
    SELECT * FROM #Y 
    ) x 
GROUP BY x.Id 

будет UNION не совокупные суммы в сценариях, которые составляют UNION e d вместе - он просто добавляет один набор записей на другой и удаляет дубликаты. Если вы хотите добавить один к другому и сохранить дубликаты затем использовать UNION ALL

Смежные вопросы