在 Postgres 中,我如何在同一查询中计算和 WHERE,然后对结果进行数学运算?
In Postgres, how do I COUNT and WHERE in the same query, then do math on result?
我有一个很大的 SALES_ORDERS
数据库,我需要确定每个 SELLING_AGENT
在 ORDER
中的百分比。
学习 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
我有一个很大的 SALES_ORDERS
数据库,我需要确定每个 SELLING_AGENT
在 ORDER
中的百分比。
学习 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