2013-12-11 70 views
4

我有一個表,每個銷售每個銷售人員每天1個記錄如何通過聲明計算組內總數的百分比?

NAME DATE 
joe 1-1-13 
joe 1-1-13 
joe 1-1-13 
dave 1-1-13 
joe 1-2-13 

我用它來創建&填充表

create table #sales (name varchar(10), salesdate date) 
insert into #sales (name, salesdate) 
values ('joe', '01-01-2013'), ('joe','01-01-2013'), 
     ('joe', '01-01-2013'), ('dave','01-01-2013'), 
     ('joe','01-02-2013') 

我想查詢拉起每個銷售人員的百分比銷售一天

(例如對於1-1-13喬在當天總共賣出4個單位中的3個(75%) 但我不知道SQL如何能夠將每天的總銷售額拉高日誌無銷售員

這和我一樣近。

select name, salesdate, count(*) as "dailyTotal" 
from #sales 
group by name, salesdate 

我該如何計算可用於計算當日百分比總量的每日總量?

+0

等待,我靠近的解決方案。 –

回答

1

使用嵌套查詢來獲取每日總量:

BEGIN 

    create table #sales (name varchar(10), salesdate date) 

    insert into #sales (name, salesdate) values 
     ('joe', '01-01-2013'), 
     ('joe', '01-01-2013'), 
     ('joe', '01-01-2013'), 
     ('dave', '01-01-2013'), 
     ('joe', '01-02-2013'), 
     ('dave', '01-02-2013') 

    SELECT name, salesdate, COUNT(*) AS personDailyTotal, MAX(dailyTotal) AS dailyTotal, 
     (COUNT(*) * 100.0)/MAX(dailyTotal) AS [Percent] 
    FROM #sales 
    INNER JOIN (
     SELECT salesdate as [day], COUNT(*) as dailyTotal 
     FROM #sales 
     GROUP BY salesdate 
    ) AS [Total] ON salesdate = [day] 
    GROUP BY name, salesdate 

END 
+1

錯誤 - 消息156,級別15,狀態1,行2 關鍵字'Percent'附近的語法不正確。 Msg 156,Level 15,State 1,Line 8 關鍵字'ON'附近的語法不正確。 –

+0

好的,字段名稱的選擇不正確 - 只要把它放在方括號中 –

+0

你去了,添加了整個腳本,以便你可以看到它的工作。不要忘記在腳本末尾放置表格,因爲您無法通過命令粘貼代碼來將表格放入其中 –

10

不是最優雅的方式來做到這一點,但你可以試試這個 -

select [name],[salesdate], COUNT(*) as dayTotal, 
SUM(COUNT(*)) over() as AllSales, 
(COUNT(*) * 1.0)/SUM(COUNT(*)) over() as dayPercent 
FROM [dbo].[sales] 
group by [name], [salesdate] 

我刪除了#您的表名稱。順便說一下,這段代碼依賴於OVER()子句。您可以瞭解如何自己截斷多餘的零。

name salesdate dayTotal AllSales dayPercent 
dave 2013-01-01 1   5   0.200000000000 
joe 2013-01-01 3   5   0.600000000000 
joe 2013-01-02 1   5   0.200000000000 

HTH。

如果這個查詢看起來太複雜了,那麼先看看這個。它會給你一個我想要做的事情的想法。

select [name],[salesdate], COUNT(*) as dayTotal, 
SUM(COUNT(*)) over() as AllSales 
FROM [dbo].[sales] 
group by [name], [salesdate] 
+0

很好的答案,但爲什麼你刪除了#符號? –

+0

非常好的答案,我不知道你可以使用總和與空白over()子句 – draca

+0

@GreenstoneWalker - 表中沒有出現在工作室,當我使用#。所以,我刪除了它。也許我沒有注意到它。 –

3

最高的答案似乎不正確。

的OP具有預期答案

例如在1-1-13喬出售3個單位共有4爲天(75%)

和尚upvoted答案顯示60%。

相反,它應該按天進行分區的所有數據求和的,這裏有一個更好的例子:

select [name],[salesdate], COUNT(*) as dayTotal, 
SUM(COUNT(*)) over(PARTITION BY salesdate) as AllDaySales, 
(COUNT(*) * 1.0)/SUM(COUNT(*)) over(PARTITION BY salesdate) as dayPercent 
FROM [dbo].[sales] 
group by [name], [salesdate] 
+0

感謝您提高編輯! – user107172

0

- 使用下面的查詢

select T1.salesdate, name ,convert(numeric(18,2),convert(decimal,count(*)) * 100/T2.total) as percentage from #sales T1 
    inner join (
    select salesdate,count(*) as total from #sales group by salesdate 
    ) as T2 
    on T1.salesdate = T2.salesdate 
    group by name,T1.salesdate,T2.total 
+1

感謝您使用此代碼段,這可能會提供一些有限的即時幫助。一個[正確的解釋將大大提高其長期價值](/ meta.stackexchange.com/q/114762/206345)通過顯示_why_這是一個很好的解決方案,並將使它對未來的讀者更有用其他類似的問題。請[編輯]你的答案以添加一些解釋,包括你所做的假設。 – Machavity