我有一张桌子,每位销售人员每天销售1条记录
NAME DATE
joe 1-1-13
joe 1-1-13
joe 1-1-13
dave 1-1-13
joe 1-2-13
Run Code Online (Sandbox Code Playgroud)
我用它来创建和填充表格
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')
Run Code Online (Sandbox Code Playgroud)
我想要一个查询来提高每个销售人员的销售额百分比
(例如在1-1-13乔售出3个单位共有4个一天(75%),但我不知道SQL怎么能每日总量当天的所有销售的拉涨,无论销售人员
这跟我一样接近.
select name, salesdate, count(*) as "dailyTotal"
from #sales
group by name, salesdate
Run Code Online (Sandbox Code Playgroud)
如何包含每日总计,以便它可用于计算当天的总百分比?
Tro*_*BOT 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]
Run Code Online (Sandbox Code Playgroud)
我删除了你的表名中的#.顺便说一下,这段代码依赖于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
Run Code Online (Sandbox Code Playgroud)
HTH.
如果该查询看起来太复杂了,那么先看看这个.它会让你知道我想要做什么.
select [name],[salesdate], COUNT(*) as dayTotal,
SUM(COUNT(*)) over() as AllSales
FROM [dbo].[sales]
group by [name], [salesdate]
Run Code Online (Sandbox Code Playgroud)
最高票的答案似乎不正确。
OP 有预期的答案
例如,在 1-1-13 当天,Joe 卖出了 4 件中的 3 件(75%)
然而,赞成的答案显示 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]
Run Code Online (Sandbox Code Playgroud)
使用嵌套查询来获取每日总计:
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
Run Code Online (Sandbox Code Playgroud)