Необходимо иметь возможность заполнять столбец 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 |
+-------+---------------+--------------+--------------+----------- ---+------------------------+----------------+