在 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 步,我们对所有总和求和,以达到这些 - 我们在函数中省略 partitionorder 关键字。

检查查询 - copy-paste 作者的 sql 结果 fiddle