Postgresql 向工作查询中添加额外的WHERE子句以按百分比进一步排序
需要能够使用存储位置上的WHERE筛选器填充“订单总数百分比”列 关于解析数据的第一个问题,我有了一些很好的答案,并学会了如何更好地在这里描述我的请求: 因此,请求的第二部分是现在能够使用Postgresql 向工作查询中添加额外的WHERE子句以按百分比进一步排序,postgresql,Postgresql,需要能够使用存储位置上的WHERE筛选器填充“订单总数百分比”列 关于解析数据的第一个问题,我有了一些很好的答案,并学会了如何更好地在这里描述我的请求: 因此,请求的第二部分是现在能够使用STORE\u LOCATION字段中的数据将数据写回PERCENT\u of_TOTAL\u ORDER列,这是基于PERCENT\u of_TOTAL\u ORDER的。注意:门店位置将仅位于北部或南部 数据库的当前状态如下所示:。在订单总数的百分比列中有几个条目,有些条目是填写的。这就是我想要填充的专栏。
STORE\u LOCATION
字段中的数据将数据写回PERCENT\u of_TOTAL\u ORDER
列,这是基于PERCENT\u of_TOTAL\u ORDER
的。注意:门店位置将仅位于北部
或南部
数据库的当前状态如下所示:。在订单总数的百分比列中有几个条目,有些条目是填写的。这就是我想要填充的专栏。所以我想我要做一个SELECT
语句和WHERE
子句来设置占总数的百分比
该实际表格目前约为500k+行,有约50k个不同的订单号
s,因此需要寻找最有效的代码来更新当前数据,然后计划将代码设置为CRON作业,以便今后每晚更新
从上面提到的上一篇文章中,这两个解决方案都得到了正确的百分比,但没有填充PERCENT\u OF_TOTAL\u ORDER
列
解决方案1:
SELECT selling_agent, order_number,
sum(sale_price_1) as sale_price_1,
sum(sale_price_2) as sale_price_2,
(sum(sale_price_1) + sum(sale_price_2)) * 100.00 / sum(sum(sale_price_1) + sum(sale_price_2)) over (partition by order_number) as orderPercentage
FROM sales_orders_test
GROUP by order_number, selling_agent
ORDER BY order_number, selling_agent
解决方案2:
SELECT s.*,
ROUND (100.00 * (s.sale_price_1 + s.sale_price_2) /
(SELECT
SUM(sale_price_1 + sale_price_2)
FROM sales_orders_test
WHERE order_number = s.order_Number), 2) percentage
FROM sales_orders_test s;
我试图在解决方案2中添加一个WHERE
子句,其中包含以下内容:
UPDATE sales_orders_test
SET percent_of_total_order =
(
SELECT selling_agent, order_number,
sum(sale_price_1) as sale_price_1,
sum(sale_price_2) as sale_price_2,
(sum(sale_price_1) + sum(sale_price_2)) * 100.00 /
sum(sum(sale_price_1) + sum(sale_price_2)) over (partition by order_number) as orderPercentage
FROM sales_orders_test
GROUP by order_number, selling_agent
ORDER BY order_number, selling_agent
)
WHERE percent_of_total_order IS NULL
…它给了我[42601]错误:子查询只能返回一列
如何根据门店位置
,将百分比输入到列中,并根据此信息进行更新
计划输出是一次填充表,然后每夜填充一次,最终结果如下:
编辑:@used_by_ready的建议(谢谢),下面是DB现在的样子:
+-------+---------------+--------------+--------------+-------------+------------------------+----------------+
| pk_id | selling_agent | order_number | sale_price_1 | sale_price_2 | percent_of_total_order | store_location |
+-------+---------------+--------------+--------------+--------------+------------------------+----------------+
| 1 | jim | 123 | 1 | 2 | | south |
| 2 | steve | 123 | 1 | 3 | | south |
| 3 | carl | 123 | 1 | 4 | | north |
| 4 | carl | 456 | 1 | 5 | | north |
| 5 | steve | 456 | 1 | 5 | | north |
| 6 | jim | 456 | 1 | 6 | 36.84 | north |
| 7 | steve | 789 | 1 | 78 | | south |
| 8 | patty | 789 | 1 | 7 | | north |
| 9 | bob | 187 | 3 | 3 | 100 | south |
+-------+---------------+--------------+--------------+----------- ---+------------------------+----------------+
以下是我希望看到的代码:
+-------+---------------+--------------+--------------+-------------+------------------------+----------------+
| pk_id | selling_agent | order_number | sale_price_1 | sale_price_2 | percent_of_total_order | store_location |
+-------+---------------+--------------+--------------+--------------+------------------------+----------------+
| 1 | jim | 123 | 1 | 2 | 42.86 | south |
| 2 | steve | 123 | 1 | 3 | 57.14 | south |
| 3 | carl | 123 | 1 | 4 | 100 | north |
| 4 | carl | 456 | 1 | 5 | 27.27 | north |
| 5 | steve | 456 | 1 | 5 | 40.91 | north |
| 6 | jim | 456 | 1 | 6 | 31.82 | north |
| 7 | steve | 789 | 1 | 78 | 100 | south |
| 8 | patty | 789 | 1 | 7 | 100 | north |
| 9 | bob | 187 | 3 | 3 | 100 | south |
+-------+---------------+--------------+--------------+----------- ---+------------------------+----------------+
我明白了!所以我想我会在这里分享它
WITH perc_sales as (
SELECT pk_id,
selling_agent,
order_number,
store_location,
sum(sale_price_1) as Sale1,
sum(sale_price_2) as Sale2,
ROUND((sum(sale_price_1) + sum(sale_price_2)) * 100.00 /
GREATEST(sum(sum(sale_price_1) + sum(sale_price_2))
over (partition by order_number, store_location), 1), 2) as orderPercentage
FROM sales_orders_test
GROUP BY pk_id
)
UPDATE sales_orders_test AS PERC_UPDATE
SET percent_of_total_order = PS.orderPercentage
FROM perc_sales PS
WHERE PS.pk_id = PERC_UPDATE.pk_id;
这给了我:
+-------+---------------+--------------+--------------+--------------+------------------------+----------------+
| pk_id | selling_agent | order_number | sale_price_1 | sale_price_2 | percent_of_total_order | store_location |
+-------+---------------+--------------+--------------+--------------+------------------------+----------------+
| 1 | jim | 123 | 1 | 2 | 42.86 | south |
| 2 | steve | 123 | 1 | 3 | 57.14 | south |
| 3 | carl | 123 | 1 | 4 | 100 | north |
| 4 | carl | 456 | 1 | 5 | 27.27 | north |
| 5 | steve | 456 | 1 | 8 | 40.91 | north |
| 6 | jim | 456 | 1 | 6 | 31.82 | north |
| 7 | steve | 789 | 1 | 78 | 100 | south |
| 8 | patty | 789 | 1 | 7 | 100 | north |
| 9 | bob | 187 | 3 | 3 | 100 | south |
+-------+---------------+--------------+--------------+--------------+------------------------+----------------+
谢谢大家的提示 您已经从select语句(其中允许多行)移动到update语句(其中只允许一个值)。在当前查询中,您试图将多个值压缩到每个“槽”中,其中只允许一个值。为了获得更快的分辨率,请提供示例数据(作为可重用文本,而不是图像)以及预期结果(文本优先于图像)。这是一个帮助准备文本表的网站:为什么不喜欢图像?想象一下,如果我们建议的解决方案是SQL的图像,您会觉得这项工作令人沮丧吗?@Used_By_已经在使用了——谢谢您的指点!更新!安迪:你可以接受这个答案(你必须等48小时才能接受自己的答案)。它帮助我们知道哪些问题尚未得到回答(反之亦然)。看见