Добавить дополнительное предложение WHERE в рабочий запрос для дальнейшей сортировки по процентам - PullRequest
0 голосов
/ 06 января 2019

Необходимо иметь возможность заполнять столбец PERCENT_OF_TOTAL_ORDER с помощью фильтра WHERE в STORE_LOCATION.

У меня было несколько отличных ответов на первый вопрос о разборе данных, и я узнал, как лучше описать мой запрос здесь: В Postgres, как мне СЧИТАТЬ и ГДЕ в одном и том же запросе, а затем вычислить результат?

Таким образом, вторая часть запроса должна теперь иметь возможность записать данные обратно в столбец PERCENT_OF_TOTAL_ORDER, используя данные в поле STORE_LOCATION, основываясь на существовании PERCENT_OF_TOTAL_ORDER. ПРИМЕЧАНИЕ. Местоположение магазина будет ТОЛЬКО north или south.

Текущее состояние БД выглядит следующим образом: http://prntscr.com/m3ktu4. В столбце PERCENT_OF_TOTAL_ORDER есть несколько записей <NULL>, а некоторые заполнены. Это столбец, который я хочу заполнить. Поэтому я думаю, что хочу сделать оператор SELECT и оператор WHERE для SET PERCENT_OF_TOTAL.

Эта фактическая таблица в настоящее время ~ 500k + строк, с ~ 50k различных ORDER_NUMBER s, поэтому ищите наиболее эффективный код для обновления текущих данных, а затем планируйте установить код как задание CRON для ночного обновления вперед.

Из предыдущего поста, упомянутого выше, оба эти 2 решения получают правильный%, но не заполняют столбец PERCENT_OF_TOTAL_ORDER.

Solution1:

    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;

Я попытался добавить предложение WHERE в Решение 2 с помощью этого:

    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] ERROR: subquery must return only one column

Как я могу получить процент в столбце, основанный на STORE_LOCATION, который будет обновляться на основе этой информации?

Запланированный результат - таблица, заполняемая один раз, а затем ночью, с конечным результатом, подобным этому: http://prntscr.com/m3l3fz

EDIT: предложение @ used_by_already (спасибо), вот БД, как она выглядит сейчас:

    +-------+---------------+--------------+--------------+-------------+------------------------+----------------+
    | 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          |
    +-------+---------------+--------------+--------------+-----------        ---+------------------------+----------------+

1 Ответ

0 голосов
/ 06 января 2019

Я понял! Так что я решил поделиться этим здесь!

    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          |
+-------+---------------+--------------+--------------+--------------+------------------------+----------------+

Спасибо всем за советы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...