Как сложить, умножить и разделить в 1 Mysql - PullRequest
0 голосов
/ 23 ноября 2018

Это уже давно меня беспокоит

table: stock

|   customerID   | Item  |  Quantity  |  Price  |
|     cus1       |  A    |     3      |    4    |
|     cus1       |  B    |     2      |    3    |
|     cus1       |  C    |     3      |    3    |
|     cus2       |  A    |     3      |    3.50 |
|     cus2       |  C    |     3      |    2    |
|     cus3       |  D    |     6      |    4    |

как сделать так, чтобы мой запрос mysql генерировал вид, подобный приведенному ниже

view: stock_v

| cusID  | Item |Quan |Price |Tot_Qua | Tot_pri | sumtot_pri/tot_qua|
|  cus1  |  A   |  3  | 4    |   8    | 12      | 3.375             | 
|  cus1  |  B   |  2  | 3    |   8    | 6       | 3.375             | 
|  cus1  |  C   |  3  | 3    |   8    | 9       | 3.375             |
|  cus2  |  A   |  3  | 3.50 |   6    | 10.05   | 2.675             |
|  cus2  |  C   |  3  | 2    |   6    | 6       | 2.675             | 
|  cus3  |  D   |  6  | 4    |   6    | 24      | 4.00              |

Пример для cus1.У Cus1 есть 3 элемента, это A, B и C. поэтому я хочу получить формулу для

Tot_Qua = 3+2+3 = 8
Tot_pri = price x quan

, и Tot_pri должен суммировать для этой записи cus1,

sumtot_pri = (quan x price) + (quan x price) + (quan x price)
sumtot_pri = (12) + (6) + (9)

, потому что у cus1 есть 3 элементаи последний

sumtot_pri / Tot_qua = 27 / 8 = 3.375

Нужна группа, я думаю, потому что я хочу видеть их пункт.Мне все равно, если столбец tot_qua и столбец sumtot_pri/tot_qua будут дублировать одни и те же данные для каждого Cus.

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

В MySQL 8+ вы просто используете оконные функции:

select s.*,
       sum(quan) over (partition by cusid) as tot_quan,
       (quan * price) as tot_price,
       sum(quan * price) over (partition by cusid) / sum(quan) over (partition by cusid) as ratio
from stock s;

В более ранних версиях вы использовали подзапросы или аналогичный механизм.Возможно join и group by проще всего:

select s.*, s2.tot_quan, (s.quan * s.price) as tot_price,
       tot_tot_price / tot_quan as ratio
from stock s join
     (select cusid, sum(quan) as tot_quan,
            sum(quan * price) as tot_tot_price
      from stock s2
      group by cusid
     ) s2
     using (cusid);
0 голосов
/ 23 ноября 2018

Этот запрос даст вам результаты, которые вы хотите.Он выполняет все необходимые агрегации в подзапросе, а затем JOIN s в основной таблице, чтобы получить желаемый результат:

SELECT s.customerID
     , Item
     , Quantity
     , Price
     , Tot_Qua
     , Quantity * Price AS Tot_pri
     , Avg_Pri
FROM stock s
JOIN (SELECT customerID
           , SUM(Quantity) AS Tot_Qua
           , SUM(Quantity * Price) / SUM(Quantity) AS Avg_Pri
      FROM stock
      GROUP BY customerID) s1
    ON s1.customerID = s.customerID

Вывод:

customerID  Item    Quantity    Price   Tot_Qua     Tot_pri     Avg_Pri
cus1        A       3           4       8           12          3.375
cus1        B       2           3       8           6           3.375
cus1        C       3           3       8           9           3.375
cus2        A       3           3.5     6           10.5        2.75
cus2        C       3           2       6           6           2.75
cus3        D       6           4       6           24          4

Демонстрацияна dbfiddle

0 голосов
/ 23 ноября 2018
select  customerID, item, quantity, price,
            (select sum(quantity) from stock s2 where stock.customerID = s2.customerID ) as tot_qua,
            price * quantity as tot_pri,
            (select sum(quantity * price) / sum(quantity) from stock s2 where stock.customerID = s2.customerID) as `sumtotpri/tot_qua`
from stock
order by stock.customerID, stock.item;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...