在 Postgres 中,我如何在同一查询中计算和 WHERE,然后对结果进行数学运算?

In Postgres, how do I COUNT and WHERE in the same query, then do math on result?

我有一个很大的 SALES_ORDERS 数据库,我需要确定每个 SELLING_AGENTORDER 中的百分比。

学习 postgresql,这只是约 50 万行数据的示例。每个ORDER#可以由几十个SALE_ITEM组成(但只由'SALE_ITEM_1''SALE_ITEM_2'组成)。

我想我可以尝试做一个 SUM SELECT 这样的事情:

    SELECT (SUM(sale_item_1)+sum(sale_item_2)) as total_person_sale
    FROM SALES_ORDER
    WHERE orderNumber LIKE orderNumber
    GROUP by SELLING_AGENT

但显然我没有掌握 WHERE 语句用于计算相似度

希望是填写最后一栏,像这样: 销售代理人:

    selling agent:  Order#  Sale_item_1 Sale_item_2 %_of_TOTAL_order
    jim              abc    .00       .00       14.29%
    steve            abc    .00       .00       33.33%
    carl             abc    .00       .00       52.38%
    carl             def    .00       .00       31.25%
    steve            def    .00       .00       37.50%
    jim              def    .00       .00       31.25%
    steve            ghi    .00       .00       61.11%
    patty            ghi    .00       .00       38.89%

您正在尝试做一些有点高级的事情。我给你两个选择:

SELECT selling_agent, orderNumber,
    sum(sale_item_1) as sale_item_1,
    sum(sale_item_2) as sale_item_2,
    (sum(sale_item_1) + sum(sale_item_2)) * 100.00 /
        sum(sum(sale_item_1) + sum(sale_item_2)) over (partition by orderNumber) as orderPercentage
FROM sales_db
--WHERE orderNumber LIKE orderNumber /* I'm not sure what this is about */
GROUP by orderNumber, selling_agent
ORDER BY orderNumber, selling_agent

这是通过子查询的旧方法:

SELECT selling_agent, orderNumber,
    sum(sale_item_1) as sale_item_1,
    sum(sale_item_2) as sale_item_2,
    (sum(sale_item_1) + sum(sale_item_2)) * 100.00 /
        (
        select sum(sale_item_1 + sale_item_2)
        from sales_db s2
        where s2.orderNumber = s.orderNumber
        )
FROM sales_db s
--WHERE orderNumber LIKE orderNumber
GROUP by orderNumber, selling_agent
ORDER BY orderNumber, selling_agent

顺便说一下,如果每个销售代理只代表每个订单号一次,这可以稍微简化一下。

像这样:

SELECT 
  s.*, 
  ROUND (
  100.00 * (s.sale_item_1 + s.sale_item_2) /
  (SELECT 
     SUM(sale_item_1 + sale_item_2)
     FROM sales_db 
     WHERE orderNumber = s.orderNumber), 2) percentage
FROM sales_db s;

demo