2015-06-24 22 views
0

我想要使用總計使用over()函數,但是當count()= 0時會導致問題。它實際上會將它們添加到總數中。真正的計數是138而不是141.我怎樣才能解決這個問題,保持計數()= 0行?使用Over()的SQL Grand Total Column()

select 
count(*) cnt, 
sum(count(*)) over() grand_total, 
count(*)/cast(sum(count(*)) over() as float) percentage 
from 
some_table 

數據(6行返回)

4,141,0.03
116,141,0.82
18,141,0.13
0,141,0.01
0,141,0.01
0,141,0.01

+2

發佈您的完整查詢。沒有'group by'的count(*)cnt'不能返回6行,並且不能返回'0'的結果,因爲那樣就不會有該行的行。 –

+0

使用CTE或派生表來獲取COUNT(*)的別名並在主查詢中引用它。 –

+0

你看了看彙總?這通常是如何處理總計:https://technet.microsoft.com/en-us/library/ms189305%28v=sql.90%29.aspx –

回答

0

我想只有部分信息的難題(感覺有點像每天實際上),所以我會給這個鏡頭。好的,over是一個有趣的函數,因爲它可以讓你指定分組之外的聚合,但是你有兩種聚合,一個over()聚合和一個沒有over功能的聚合。我將假設第一列是一些東西(我稱之爲銷售),並且該組是在一個類別(我將它稱爲產品)。有了這個假設你的SQL最終看起來像:

Select ProductID 
    , count(1) as UnitsSold 
    , sum(count(1)) over() as TotalSales 
    , cast(count(1) as money)/cast(sum(count(1)) over() as money) 
From SomeTable 
group by ProductID 

一個聰明人的話,從來沒有使用float,除非你有一個關鍵任務之所以這樣做,浮動是一個近似值,這可能會導致各種問題。我用百分比表示的快速而骯髒的替代品是金錢,默認爲小數點後四位,這對於大多數業務需求來說已經足夠了。

無論如何,繼續我的預感,我在猜測我們正在查看產品表的左外連接到銷售表(或其他諸如此類的多對一關係),所以我們有一些沒有銷售的產品正在計數,這就是爲什麼你認爲總數應該小於你從計數中獲得的原因。只是爲了得到這個「紙」:

Select a.ProductID 
    , count(1) as UnitsSold 
    , sum(count(1)) over() as TotalSales 
    , cast(count(1) as money)/cast(sum(count(1)) over() as money) 
From SomeTable_Products a 
    left outer join SomeTable_Sales b 
group by a.ProductID 

如果是這樣的話,你沒有指望正確的事情是你的問題。可以通過將其更改爲:

Select a.ProductID 
    , count(b.SalesID) as UnitsSold 
    , sum(count(b.SalesID)) over() as TotalSales 
    , cast(count(b.SalesID) as money)/cast(sum(count(b.SalesID)) over() as money) 
From SomeTable_Products a 
    left outer join SomeTable_Sales b 
group by a.ProductID 

b.SalesID是銷售表的PK(因此是唯一的)。希望我猜對了,希望有所幫助。