在 Postgres 中按值计算组的百分比值
Calculating Percentage value for a Group by value in Postgres
我想计算分组依据中某个值的百分比。我的 Table 数据
salesId salesAmount productName salesTyp
------- ----------- ----------- --------
1 50.00 mouse online
2 100.00 mouse shop
3 150.00 mouse shop
4 50.00 mouse shop
5 100.00 keyboard shop
6 50.00 keyboard online
我想展示的输出
productName totalamount percentageofonline
----------- ----------- ------------------
mouse 350 25.00
keyboard 150 50.00
这里售出了 4 只鼠标(3 只在店里,1 只在网上)所以百分比是 25.00
并且售出了 2 个键盘(1 个在店内,1 个在网上)所以百分比是 50.00
请帮我拿下。我为 table 结构创建了一个 SQLFIDDLE。
快速:
WITH total AS (
SELECT productName, sum(salesAmount) AS totalamount
FROM testSales
GROUP BY productName
)
SELECT total.totalamount, total.productName, (
SELECT count(*)
FROM testSales
WHERE salesTyp='online'
AND productName = total.productName
)::float / count(*) * 100 as percentageofonline
FROM testSales, total
WHERE testSales.productName = total.productName
GROUP BY total.productName, total.totalamount
第一个子请求计算总量,子请求用于百分比。
必须有一种更优化的方法来做到这一点,但确实可以做到这一点
您可以使用window functions
SELECT productname,
totalamount,
TO_CHAR(totalamount * 100 / SUM(totalamount) OVER (), 'fm90D00%') AS prc
FROM (
SELECT productname,
SUM(salesAmount) AS totalamount
FROM sales
GROUP BY productname
) AS t
在第 1 步,我们有一个子查询,它按乘积生成总和。在第 2 步,我们对所有总和求和,以达到这些 - 我们在函数中省略 partition
和 order
关键字。
检查查询 - copy-paste 作者的 sql 结果 fiddle
我想计算分组依据中某个值的百分比。我的 Table 数据
salesId salesAmount productName salesTyp
------- ----------- ----------- --------
1 50.00 mouse online
2 100.00 mouse shop
3 150.00 mouse shop
4 50.00 mouse shop
5 100.00 keyboard shop
6 50.00 keyboard online
我想展示的输出
productName totalamount percentageofonline
----------- ----------- ------------------
mouse 350 25.00
keyboard 150 50.00
这里售出了 4 只鼠标(3 只在店里,1 只在网上)所以百分比是 25.00
并且售出了 2 个键盘(1 个在店内,1 个在网上)所以百分比是 50.00
请帮我拿下。我为 table 结构创建了一个 SQLFIDDLE。
快速:
WITH total AS (
SELECT productName, sum(salesAmount) AS totalamount
FROM testSales
GROUP BY productName
)
SELECT total.totalamount, total.productName, (
SELECT count(*)
FROM testSales
WHERE salesTyp='online'
AND productName = total.productName
)::float / count(*) * 100 as percentageofonline
FROM testSales, total
WHERE testSales.productName = total.productName
GROUP BY total.productName, total.totalamount
第一个子请求计算总量,子请求用于百分比。
必须有一种更优化的方法来做到这一点,但确实可以做到这一点
您可以使用window functions
SELECT productname,
totalamount,
TO_CHAR(totalamount * 100 / SUM(totalamount) OVER (), 'fm90D00%') AS prc
FROM (
SELECT productname,
SUM(salesAmount) AS totalamount
FROM sales
GROUP BY productname
) AS t
在第 1 步,我们有一个子查询,它按乘积生成总和。在第 2 步,我们对所有总和求和,以达到这些 - 我们在函数中省略 partition
和 order
关键字。
检查查询 - copy-paste 作者的 sql 结果 fiddle