2017-07-14 50 views
0

我遇到了編寫正確的查詢來解決我的問題的巨大問題。因此,我的問題的快速描述:MySQL如何獲得項目總和

A是由產品B和C組成的集合,例如,集合A由4xB和1xC.le組成,集合A由4xB和1xC組成。

Set A 
4x B 
1x C 

我還可以單獨出售的產品B或C.

所以,如果我賣一個A和一個產品B,我應該像

Product: Sold: 
A   1 
B   5 
C   1 

數據結構的結果:

table products 
id name 
1 A 
2 B 
3 C 

table products_subset 
id parent_id product_id amount 
1  1   2    4 
2  1   3    1 

table documents 
doc_id type code 
1  bill INV-1 
2  bill INV-2 

table document_products 
id doc_id prod_id amount price 
1 1  1   1   10 
2 2  2   1   2 

如果這不能通過查詢來解決,那麼我只會寫一個代碼來做數學,但是想做盡可能在查詢本身。

+2

請顯示您的表格結構。 –

+0

除非我們能夠看到數據結構,否則我們無法真正告訴您任何事情,我們所得到的只是一個抽象描述和所需的輸出。還有,你有任何疑問,你已經作爲一個起點? – ADyson

+0

我用簡化的數據結構更新了我的文章。 – Igor

回答

2
SELECT 
    product_id, `name`, SUM(amount) 
FROM 
    (SELECT 
     dp.product_id, p.`name`, dp.amount 
    FROM 
     document_products dp 
    JOIN products p ON p.id = dp.product_id 
    UNION ALL 
    SELECT 
     ps.product_id, p1.`name`, ps.amount 
    FROM 
     document_products dp 
    JOIN products p ON p.id = dp.product_id 
    JOIN products_subset ps ON dp.product_id = ps.parent_id 
    JOIN products p1 ON p1.id = ps.product_id) AS t1 
GROUP BY 1 , 2 

結果

id name amount 
1 A  1 
2 B  5 
3 C  1 
0

我設法拼湊查詢返回適量。我的整個查詢:

select warehouse_id, sum(amount_reserved), sum(amount_shipped) from (
select 
    doc.warehouse_id warehouse_id, 
    sum(puso.so_amount) amount_reserved, 
    sum(puso.so_amount_shipped) amount_shipped 
from 
    products_use pu 
    left join products_use_documents puso on (puso.company_id = 1111 and 
puso.products_use_id = pu.id) 
    left join documents doc on (doc.id = puso.parent_id and doc.company_id = 1111) 
where 
    pu.company_id = 1111 
    and pu.a_id = 11112222333 
    and pu.parent_type = 'PR_SO' 
    and doc.status_closed_manually = 0 
    and doc.status_shipped = 0 
    and doc.warehouse_id is not null 
    and IF(puso.so_amount is not null, puso.so_amount, 0) > IF(puso.so_amount_shipped is not null, puso.so_amount_shipped, 0) 
UNION 
select 
    doc.warehouse_id warehouse_id, 
    sum(puso.so_amount * ps.amount) amount_reserved, 
    sum(puso.so_amount_shipped * ps.amount) amount_shipped 
from 
    product_sets ps 
    left join products_use pu on (ps.product_id = pu.a_id) 
    left join products_use_documents puso on (puso.company_id = 1111 and puso.products_use_id = au.id) 
    left join documents doc on (doc.id = puso.parent_id and doc.company_id = 1111) 
where 
    ps.company_id = 1111 and 
    ps.product_set_id = 11112222333 and 
    pu.company_id = 1111 
    and pu.parent_type = 'PR_SO' 
    and doc.status_closed_manually = 0 
    and doc.status_shipped = 0 
    and doc.warehouse_id is not null 
    and IF(puso.so_amount is not null, puso.so_amount, 0) > IF(puso.so_amount_shipped is not null, puso.so_amount_shipped, 0)) l 
group by l.warehouse_id