В Postgres, как я могу РАССЧИТАТЬ и ГДЕ в одном запросе, а затем вычислить результат? - PullRequest
0 голосов
/ 05 января 2019

У меня есть большая база данных SALES_ORDERS, мне нужно определить% каждого SELLING_AGENT в ORDER.

Изучение postgresql, и это всего лишь пример из ~ 500 тыс. Строк данных. Каждый ORDER# может состоять из десятков SALE_ITEM с (но только из 'SALE_ITEM_1' и 'SALE_ITEM_2').

Я думал, что мог бы попытаться сделать ВЫБОР СУММЫ что-то вроде этого:

    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    $1.00       $2.00       14.29%
    steve            abc    $3.00       $4.00       33.33%
    carl             abc    $5.00       $6.00       52.38%
    carl             def    $7.00       $8.00       31.25%
    steve            def    $9.00       $9.00       37.50%
    jim              def    $8.00       $7.00       31.25%
    steve            ghi    $6.00       $5.00       61.11%
    patty            ghi    $4.00       $3.00       38.89%

Ответы [ 2 ]

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

Примерно так:

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;

См. Демоверсию

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

Вы пытаетесь сделать что-то более продвинутое. Я дам вам два варианта:

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

Кстати, если каждый агент по продаже представлен только один раз для номера заказа, это можно немного упростить.

...