Mysql 如何在SELECT中无需庞大的子查询即可获得总销售额的百分比
我面临一个问题,即如何计算“生成量”列的总数,以便可以使用它来计算 (用户销售额/总用户销售额)百分比比率Mysql 如何在SELECT中无需庞大的子查询即可获得总销售额的百分比,mysql,sql,sql-server,Mysql,Sql,Sql Server,我面临一个问题,即如何计算“生成量”列的总数,以便可以使用它来计算 (用户销售额/总用户销售额)百分比比率 SELECT * FROM Sales ID Item Amount 5 IS1 10.00 5 IS2 2.00 3 IS1 10.00 2 IS3 7.00 9 IS5 6.00 Example 35.00 DESIRED OUTPUT ID
SELECT * FROM Sales
ID Item Amount
5 IS1 10.00
5 IS2 2.00
3 IS1 10.00
2 IS3 7.00
9 IS5 6.00
Example 35.00
DESIRED OUTPUT
ID Amount Percentage
5 12.00 34.28571%
3 10.00 28.57142%
2 7.00 20.00000%
9 6.00 17.14285%
Example 35.00 100.0000%
SELECT ID, SUM(Amount) AS Amount
FROM Sales
GROUP BY ID
我在stack和其他论坛上看到过各种各样的例子,人们使用一个额外的select来计算总额列
SELECT ID, SUM(Amount) AS Amount,(SELECT SUM(Amount) FROM Sales) AS Total, Amount/(SELECT SUM(Amount) FROM Sales)*100 AS Percentage
FROM Sales
GROUP BY ID
但是当我的select查询很大时,我该怎么办呢?您是否仍然将它放在select查询中,或者是否有更好的方法来实现这一点
SELECT a.ID, SUM(a.Amount) AS Amount, @rank:=@rank + 1 AS rank
FROM Sales a
INNER JOIN (SELECT @rank:=0) r
WHERE a.Item='IS1'
AND a.tdate='2015-01-20'
GROUP BY a.ID
ORDER BY Amount
原始查询实际上比这个长,因为它还从其他表中提取描述和值
基本上,我所做工作的原始代码将进入销售表,按当日、按产品、按产品子单元id、按交易id提取所有用户销售数据。然后对特定交易id当日销售最高产品的用户进行排名
当然,这段代码非常庞大,所以我不确定在SELECT查询中再次添加这段代码来计算总数是否正确
没有办法,它可以不进行另一次查询就计算出总金额吗?这将在MSSQL上工作,但不确定MySQL
Select distinct ID, SUM(AMOUNT) OVER (PARTITION BY ID) Amount, SUM(AMOUNT) OVER (PARTITION BY ID) / SUM(AMOUNT) OVER (PARTITION BY 1) * 100 Percentage
from Sales
order by ID
如上图所示,它为您提供了所需的输出。如果解决了我的问题,我更喜欢group by而不是窗口函数:
SELECT a.ID, SUM(a.Amount) AS Amount, @rank:=@rank + 1 AS rank
, s.SumAll Total
, SUM(a.Amount)/s.SumAll*100 Percentage
FROM Sales a
, (SELECT @rank:=0) r
, (SELECT SUM(Amount) SumAll FROM Sales ) s
WHERE a.Item='IS1'
AND a.tdate='2015-01-20'
GROUP BY a.ID
ORDER BY Amount
假设sales
实际上是一个相当昂贵的视图,那么您最好使用它(asuming mysql喜欢窗口函数):
试一试
此查询生成所需的输出,而不需要MySQL中的子查询SUM(Amount)OVER()给出总金额
SELECT ID, SUM(Amount) AS Amount,
SUM(Amount)*100/SUM(Amount) OVER () AS percentage
FROM Sales
GROUP BY ID
答案应该对MySQL和SQL Server都有效,因为您正在使用这两种产品?嗨,如果我能让它为MySQL工作,我会很高兴。如果您提供一张表格,这将有助于其他人找到解决方案。嗨,Mobasher,我刚刚在MSSQL中尝试了Jaques代码,它工作得非常好,是否有一个MySQL等价于过分区?正确标记!!!MySQL SQL Server。这是哪一个???你知道你在MySQL上看到的分区吗,我找不到任何资源来说明这一点,因为你的方法确实在MSSQL上工作。现在我需要找到MySQL的等价项。我试过了,在我的生活中不起作用对不起,我错了。我扫描了一个页面,没有意识到提示中显示了
SQL
。这里有一个可能会有帮助的参考资料,没问题,谢谢你的帮助。在做了更多的研究之后,如果不运行额外的查询,在MySQL中这样做似乎是不可能的。这可能与将其添加到select查询中是一样的。这种类型的代码正是我所担心的。看看你是如何计算总销售额的。当SELECT查询像我上面给出的一些例子一样庞大时,你会怎么做?@adam gouldie我添加了第二个选项,但我认为mysql不支持它。您将需要一个子查询来计算总金额,而不是像您在原始报表中所做的那样需要两个子查询。请将此代码的格式正确设置好吗?并可能解释一下为什么这解决了这个问题,因为这使得答案比纯代码更有用。
declare @total_amt as decimal(18,5)
set @total_amt=(select sum(isnull(AMOUNT,0)) from Sales)
select Id,AMOUNT,(SUM(Amount)/(@total_amt)*100) as Percentage from Sales group by Id
SELECT ID, SUM(Amount) AS Amount,
SUM(Amount)*100/SUM(Amount) OVER () AS percentage
FROM Sales
GROUP BY ID