我想只有部分信息的難題(感覺有點像每天實際上),所以我會給這個鏡頭。好的,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(因此是唯一的)。希望我猜對了,希望有所幫助。
發佈您的完整查詢。沒有'group by'的count(*)cnt'不能返回6行,並且不能返回'0'的結果,因爲那樣就不會有該行的行。 –
使用CTE或派生表來獲取COUNT(*)的別名並在主查詢中引用它。 –
你看了看彙總?這通常是如何處理總計:https://technet.microsoft.com/en-us/library/ms189305%28v=sql.90%29.aspx –