如何计算分组中的总分百分比?

dra*_*aca 5 sql sql-server

我有一张桌子,每位销售人员每天销售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)

  • 特洛伊木马,单个哈希表指示一个临时表,该表仅对创建它的会话可见,并在会话断开连接时自动删除。它们在tempdb数据库中创建。另外,这是另一个“好答案”-我也不知道空白的OVER子句。 (2认同)

use*_*172 5

最高票的答案似乎不正确。

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)


Chr*_*tta 2

使用嵌套查询来获取每日总计:

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)