Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在SELECT中无需庞大的子查询即可获得总销售额的百分比_Mysql_Sql_Sql Server - Fatal编程技术网

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