2014-03-31 58 views
0
site  device  site_count  
================================= 
1   AB1   45    
1   AB2   45    
1   AB3   45    
1   AB4   45    
1   AB5   45    
2   AB6   70    
2   AB7   70    
2   AB8   70    
3   AB9   100   
3   A10   100   
4   A11   10 

的下面總和(SITE_COUNT)是通過將位點計數值而獲得的獨特位點,即45 + 70 + 100 + 10 = 225(不論無次站點出現)。SUM不同且唯一的列的值

site  device  site_count  sum(site_count) 
==================================================== 
1   AB1   45   225 
1   AB2   45   225 
1   AB3   45   225 
1   AB4   45   225 
1   AB5   45   225 
2   AB6   70   225 
2   AB7   70   225 
2   AB8   70   225 
3   AB9   100   225 
3   A10   100   225 
4   A11   10   225 

您可以發佈查詢以獲取總和(site_count)和其他列值在一個單一的查詢。結果集顯示在上方。

+0

窗口函數 –

+0

我試過窗口的功能,但它總結了600這是所有網站的計數總和。無法根據不同的網站獲得總和 –

+0

任何幫助@sql好朋友... –

回答

1

你可以和使用不同的:

select site, device, site_count, sum(distinct site_count) over() 
from mytable; 

編輯:當然,你可以做同樣的無窗的功能,但是這可能會比較慢:

select site, device, site_count, (select sum(distinct site_count) from mytable) 
from mytable; 

新的編輯:我誤讀你的申請。在您的評論中,您已解釋說您並不是在尋找不同的網站數量,而只是針對所有網站的網站數量總和。所以這裏是我的答案的更新。

不幸的是,您沒有一張表格和一張設備表格,因爲您應該這樣做,但只有持有該網站的設備的表格會冗餘計數。你應該改變這一點。說到這一點,當然即使有像您這樣的不利數據模型,仍然可以選擇數據。這只是一點點工作。

您需要每個站點的站點數量一次。因此,按站點分組並採取最小值,最大值或平均站點數量 - 它們應該全部相同,因爲值會被冗餘存儲。再總結這些網站計數:

select site, device, site_count, 
(
    select sum(distinct_site_count) 
    from 
    (
    select min(site_count) as distinct_site_count from mytable group by site 
) 
) 
from mytable; 

或者更緊湊:

select site, device, site_count, 
    (select sum(min(site_count)) from mytable group by site) 
from mytable; 
+0

不工作@Thorsten Kettner –

+0

這兩個語句中的哪一個不起作用?你會得到什麼錯誤?這兩個陳述看起來都是對的。 AFAIK第一個不適用於MySQL,因爲MySQL不支持窗口功能。但它應該在Oracle 11g中運行。第二個聲明應該可以在兩個dbms中工作。 –

+0

請參閱@Thorsten問題,現在我已經採取了不同的site_count,例如,如果站點A的值爲45,站點C的值爲45,則這兩個45中的值不同(它們是不同的,因爲它們屬於兩個不同站點),您的兩個查詢都將只有45次只有一次。現在清楚了嗎?我很高興與此:選擇網站,設備,site_count,總和(不同site_count)在() 從mytable;但前提是它符合我上面提到的問題。希望你得到了我指出的問題。 –