2013-03-24 199 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

是的,你應該看到預期的差異。
給你一個例子,你會明白爲什麼在group by之後,總行數小於你在內聯合查詢中得到的行數。 例如,這是你的內部查詢輸出:

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

你在你的內心查詢中使用UNION,但這些2行是不同的,因爲數是不同的。
然而,那麼你使用GROUP BY在外部查詢,組通過現場,建設,.....
那麼這些兩行將會成爲一個,並計算將是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