сумма выбора подзапроса - PullRequest
0 голосов
/ 17 июня 2020

Как суммировать подзапросы, такие как total_3m и total_30?

SUM(p.quantity),
SUM(ptpq.procurement_quantity),
SUM(p.quantity*ptpq.procurement_quantity) as ostatok,
 (SELECT SUM(op.quantity*ptpq.procurement_quantity) FROM oc_order_product op LEFT JOIN oc_order o ON (op.order_id = o.order_id) LEFT JOIN oc_procurement_to_product_quantity ptpq ON (ptpq.product_id = op.product_id) WHERE (o.order_status_id is null or (o.order_status_id != 0 AND o.order_status_id != 19 AND o.order_status_id != 8)) and op.product_id = pptp.product_id AND DATE(o.date_added) >= '2020-03-17' AND DATE(o.date_added) <= '2020-06-17') as total_3m,
 (SELECT SUM(op.quantity*ptpq.procurement_quantity) FROM oc_order_product op LEFT JOIN oc_order o ON (op.order_id = o.order_id) LEFT JOIN oc_procurement_to_product_quantity ptpq ON (ptpq.product_id = op.product_id) WHERE (o.order_status_id is null or (o.order_status_id != 0 AND o.order_status_id != 19 AND o.order_status_id != 8)) and op.product_id = pptp.product_id AND DATE(o.date_added) >= '2020-05-18' AND DATE(o.date_added) <= '2020-06-17') as total_30
 FROM oc_procurement_product pp 
 LEFT JOIN oc_procurement_product_to_product pptp ON (pp.procurement_product_id = pptp.procurement_product_id)
 LEFT JOIN oc_procurement_to_product_quantity ptpq ON (ptpq.product_id = pptp.product_id)
 LEFT JOIN oc_product p ON (p.product_id = pptp.product_id)
 GROUP BY pp.procurement_product_id

Я пробовал вот так

(SELECT SUM(col_sum) 
    FROM ((SELECT SUM(op.quantity*ptpq.procurement_quantity) as col_sum 
           FROM oc_order_product op 
           LEFT JOIN oc_order o 
           ON (op.order_id = o.order_id) 
           LEFT JOIN oc_procurement_to_product_quantity ptpq 
           ON (ptpq.product_id = op.product_id) 
           WHERE (o.order_status_id is null 
               or (o.order_status_id != 0 
               AND o.order_status_id != 19 
               AND o.order_status_id != 8)) 
           and op.product_id = pptp.product_id 
           AND DATE(o.date_added) >= '2020-03-17' 
           AND DATE(o.date_added) <= '2020-06-17') as total_3m)) 

, но уловил ошибку в неизвестном столбце pptp.product_id в 'where clause'

1 Ответ

0 голосов
/ 17 июня 2020

Я решил это примерно так, как в этих двух ответах MySQL: Сумма нескольких подзапросов MySQL: сумма значений из подзапросов путем выбора из моего выбора

SELECT 
t.procurement_product_id,
 SUM(t.total_3m),
 SUM(t.total_30),
 SUM(t.ostatok) as ostatok,
 t.stock,
 (SUM(t.ostatok) + t.stock) as sum_stock
FROM (
SELECT pp.procurement_product_id,
 p.quantity,
 ptpq.procurement_quantity,
 (p.quantity*ptpq.procurement_quantity) as ostatok,
 (SELECT SUM(quantity) 
FROM oc_procurement_stock WHERE procurement_product_id = pp.procurement_product_id) as stock,
 (SELECT SUM(op.quantity*ptpq.procurement_quantity) as col_sum FROM oc_order_product op
 LEFT JOIN oc_order o ON (op.order_id = o.order_id)
 LEFT JOIN oc_procurement_to_product_quantity ptpq ON (ptpq.product_id = op.product_id) 
WHERE (o.order_status_id is null 
OR (o.order_status_id != 0 AND o.order_status_id != 19 AND o.order_status_id != 8)) AND op.product_id = pptp.product_id 
AND DATE(o.date_added) >= '2020-03-17' 
AND DATE(o.date_added) <= '2020-06-17') as total_3m,
 (SELECT SUM(op.quantity*ptpq.procurement_quantity) 
FROM `oc_order_product` op
 LEFT JOIN `oc_order` o ON (op.order_id = o.order_id)
 LEFT JOIN `oc_procurement_to_product_quantity` ptpq ON (ptpq.product_id = op.product_id)
 WHERE (o.order_status_id is null or (o.order_status_id != 0 AND o.order_status_id != 19 AND o.order_status_id != 8)) 
 AND op.product_id = pptp.product_id
 AND DATE(o.date_added) >= '2020-05-18'
 AND DATE(o.date_added) <= '2020-06-17') as total_30
 FROM oc_procurement_product pp 
LEFT JOIN oc_procurement_product_to_product pptp ON (pp.procurement_product_id = pptp.procurement_product_id)
LEFT JOIN `oc_procurement_to_product_quantity` ptpq ON (ptpq.product_id = pptp.product_id)
LEFT JOIN `oc_product` p ON (p.product_id = pptp.product_id)) t GROUP BY t.procurement_product_id```

...