2016-02-17 35 views
1

我有三個MySQL表,已成功完成了一個查詢,該查詢對訂單顯示的付款表進行了一些計算。mysql從現有查詢中的另一個表中獲取列值

問題: 需要從下面提查詢聯接條件sku_mapping表取一個FULL_NAME列

CONCAT( 'F |',fk_orders.sku)= sku_mapping.prefix_sku

fk_orders

|order_item_id |order_id |Invoice_No  |Invoice_No_Amt |Qty |Refund_Qty |Refund_Amount | sku 
------------------------------------------------------------------------------------------------------ 
|1131231  |123   |F08OTTN16-1  |100   |1  |   |    |A3001 
|1113138  |321   |F08OTTN16-2  |200   |2  |1   |200   |B1001 
|1231231  |023   |F08OTTN16-3  |100   |1  |1   |100   |C2001 
|1133138  |320   |F08OTTN16-4  |200   |2  |   |    |D8901 
|1134231  |103   |F08OTTN16-5  |100   |1  |   |    |E6210 
|1113538  |300   |F08OTTN16-6  |200   |2  |   |    |F1001 
|1003538  |300   |F08OTTN16-7  |200   |2  |   |    |G9003 

fk_payments

|order_item_id |order_id |Invoice_No  |Invoice_No_Amt |Settlement_Value 
----------------------------------------------------------------------------------- 
|OI:1131231  |123   |F08OTTN16-1  |100   |40 
|OI:1113138  |321   |F08OTTN16-2  |200   |150 
|OI:1231231  |023   |F08OTTN16-3  |100   |-50 
|OI:1133138  |320   |F08OTTN16-4  |200   |200 
|OI:1134231  |103   |F08OTTN16-5  |100   |40 
|OI:1113538  |300   |F08OTTN16-6  |200   |250 
|OI:1131231  |123   |F08OTTN16-1  |100   |40 
|OI:1133138  |320   |F08OTTN16-4  |200   |100 
|OI:1113138  |321   |F08OTTN16-2  |200   |-200 

sku_mapping

|prefix_sku |full_name 
------------------- 
x|A3001  |Apple_Phone 
f|B1001  |Belkin 
f|C2001  |Cat_Access 
f|D8901  |Dlink 
f|E6210  |Eltron 
f|F1001  |Flag 
f|G9003  |gott 
f|A3001  |Phone 
a|B1001  |Belkin 
a|C2001  |Cat_Access 
a|D8901  |Dlink 
a|E6210  |Eltron 
a|F1001  |Flag 
a|G9003  |gott 

當前結果

|order_item_id |order_id |Invoice_No  |Invoice_No_Amt |Qty |Refund_Qty |Refund_Amount |sku |SettledAmount |netAmount 
------------------------------------------------------------------------------------------------------------------------------------ 
|1131231  |123  |F08OTTN16-1 |100   |1  |   |    |A3001 |80    |20 
|1113138  |321  |F08OTTN16-2 |200   |2  |1   |200   |B1001 |150   |50 
|1231231  |23   |F08OTTN16-3 |100   |1  |1   |100   |C2001 |50    |50 
|1133138  |320  |F08OTTN16-4 |200   |2  |   |    |D8901 |300   |-100 
|1134231  |103  |F08OTTN16-5 |100   |1  |   |    |E6210 |40    |60 
|1113538  |300  |F08OTTN16-6 |200   |2  |   |    |F1001 |250   |-50 
|1003538  |300  |F08OTTN16-7 |200   |2  |   |    |G9003 |0    |200 

預期結果(從需要表sku_prefix FULL_NAME列)

|order_item_id |order_id |Invoice_No  |Invoice_No_Amt |Qty |Refund_Qty |Refund_Amount |sku |SettledAmount |netAmount |full_name 
----------------------------------------------------------------------------------------------------------------------------------------------- 
|1131231  |123  |F08OTTN16-1 |100   |1  |   |    |A3001 |80    |20   |Apple_Phone 
|1113138  |321  |F08OTTN16-2 |200   |2  |1   |200   |B1001 |150   |50   |Belkin 
|1231231  |23   |F08OTTN16-3 |100   |1  |1   |100   |C2001 |50    |50   |Cat_Access 
|1133138  |320  |F08OTTN16-4 |200   |2  |   |    |D8901 |300   |-100  |Dlink 
|1134231  |103  |F08OTTN16-5 |100   |1  |   |    |E6210 |40    |60   |Eltron 
|1113538  |300  |F08OTTN16-6 |200   |2  |   |    |F1001 |250   |-50  |Flag 
|1003538  |300  |F08OTTN16-7 |200   |2  |   |    |G9003 |0    |200  |gott 

目前代碼

select o.*, 
     (coalesce(Refund_Amount, 0) + coalesce(sv, 0)) as SettledAmount, 
     (Invoice_No_Amt - coalesce(Refund_Amount, 0) - coalesce(sv, 0)) as netAmount 
from fk_orders o left join 
    (select invoice_no, sum(Settlement_Value) as sv 
     from fk_payments 
     group by invoice_no 
    ) p 
    on o.invoice_no = p.invoice_no; 
+0

發佈您當前的代碼,使人們可以從 – Matt

+0

@馬特已經添加code.Thanks我已經錯過了 – Kanted

+0

您目前如何拉回SKU的工作嗎?代碼中沒有提到它,或者它在fk_orders表中沒有提及? – Matt

回答

1

假設fk_orders公頃是一個sku場。

SELECT o.*, sk.full_name, (coalesce(Refund_Amount, 0) + coalesce(sv, 0)) AS SettledAmount, (Invoice_No_Amt - coalesce(Refund_Amount, 0) - coalesce(sv, 0)) AS netAmount 
FROM fk_orders o 
LEFT JOIN (SELECT invoice_no, SUM(Settlement_Value) AS sv 
      FROM fk_payments 
      GROUP BY invoice_no) p ON o.invoice_no = p.invoice_no 
INNER JOIN sku_mapping sk ON o.sku = SUBSTRING_INDEX(prefix_sku,'|',-1) 
+0

完美運行。已編輯訂單表。我以前錯過了添加sku列 – Kanted

+0

上面的代碼有問題,它曾與測試表一起工作。實際的前綴是「f |」我沒有將其替換爲SUBSTRING_INDEX(prefix_sku,'f |', - 1),但輸出結果發票序列被掛起。我在每張桌子上也有大約40000行。而且每張表都有許多其他列,因爲這些列沒有列在上面,所以只是想看起來很整齊。如果沒有內連接,代碼也可以工作於40 K行。但如果我添加內部聯接代碼沒有結果。我已經在sku_table中做了一些小的改動,所以你在你的地方複製它 – Kanted

+0

它不會影響'''之前的內容,它可能是'abc | E3001'和相同的代碼會挑出'E3001' – Matt

相關問題