Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 向工作查询中添加额外的WHERE子句以按百分比进一步排序_Postgresql - Fatal编程技术网

Postgresql 向工作查询中添加额外的WHERE子句以按百分比进一步排序

Postgresql 向工作查询中添加额外的WHERE子句以按百分比进一步排序,postgresql,Postgresql,需要能够使用存储位置上的WHERE筛选器填充“订单总数百分比”列 关于解析数据的第一个问题,我有了一些很好的答案,并学会了如何更好地在这里描述我的请求: 因此,请求的第二部分是现在能够使用STORE\u LOCATION字段中的数据将数据写回PERCENT\u of_TOTAL\u ORDER列,这是基于PERCENT\u of_TOTAL\u ORDER的。注意:门店位置将仅位于北部或南部 数据库的当前状态如下所示:。在订单总数的百分比列中有几个条目,有些条目是填写的。这就是我想要填充的专栏。

需要能够使用存储位置上的WHERE筛选器填充“订单总数百分比”列

关于解析数据的第一个问题,我有了一些很好的答案,并学会了如何更好地在这里描述我的请求:

因此,请求的第二部分是现在能够使用
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小时才能接受自己的答案)。它帮助我们知道哪些问题尚未得到回答(反之亦然)。看见