2012-07-31 73 views
0

我有一個購物車,需要以表格格式列出訂單。每個訂單可以包含多種產品,每種產品可能有多種選擇(這些是書類型產品,您可以選擇不同的封面顏色(不收取額外費用),或將您的名字壓印在上面(額外收費)1到很多> 1到許多分組/子查詢

ERD

我至今是

select 
order_id, 
sum(price_paid * ordered_qty), 
group_concat(product_code SEPARATOR '/') 
from 
orders join order_lines USING (order_id) 
where 
DATE_FORMAT(order_date, '%Y%m') >= '201203' and DATE_FORMAT(order_date, '%Y%m') <= '201203' and order_status = 'SHIPPED' and item_status = 'LINESHIPPED' 
group by order_id 
order by order_id 

這忽略的選項(order_line_options表),並返回此:

58 21.98 SKU-12/SKU-12 
59 10.99 SKU-12 
60 67.78 SKU-31/SKU-12/SKU-56 
61 259.45 SKU-98/SKU-06/SKU-98 
62 9.49 SKU-40/SKU-36 

哪個正確總結的單位成本*數量,並列出一個單列的產品代碼(重複的產品代碼表示訂購不同的選項)

我現在需要的是選項,用於產品的結果是這樣的:

58 21.98 SKU-12 (Color: Red, 0.00 - Printname 0.00)/SKU-12 (Color: Blue, 0.00 - Printname 4.95) 

只是SKU-12中所示的一階藍色下令兩次,一次在紅和曾與名字印爲$ 4.95

我已經花一天時間/ GROUP_CONCAT和子查詢嘗試額外的組,但我米甚至沒有接近解決方案,所以任何幫助將是偉大的。 Kevin

+0

是否每個line_item_option都填寫了所有三個字段? (更具體地說,「Printname」來自哪個字段?) – 2012-07-31 18:37:19

+0

line_item_option可以具有從0到與特定產品關聯的任何(但通常爲1或2)記錄/選項的任何數字。並且sone的成本爲零,因此可以忽略,並且需要總結> 0的其他成本。 「打印名稱」只是一個示例選項名稱(即客戶選擇他們的名字壓在封面上,費用爲4.95美元 – KevInSol 2012-07-31 20:02:04

回答

1

您可能會希望在SELECT子句中使用兩個相關的子查詢。我想以下應該適合你:

select 
order_id, 
sum(price_paid 
    * ordered_qty 
    -- add the cost of any subitems for this line 
    + IFNULL((select sum(option_cost) 
      from order_line_options olo 
     where olo.order_line_id = order_lines.order_line_id),0) 
), 
--Here product_code 
group_concat(
    CONCAT(product_code, 
    ' (', 
    (select group_concat(
      CONCAT(option_name, ': ', 
       option_value, ', ' 
       option_cost 
       ) 
      SEPARATOR '-' 
     ) 
    from order_line_options olo 
    where olo.order_line_id = order_lines.order_line_id 
    group by olo.order_line_id 
    ), 
    ')' 
) -- end of CONCAT() which creates subitem list 
    SEPARATOR '/' 
) 
from 
orders join order_lines USING (order_id) 
where 
    DATE_FORMAT(order_date, '%Y%m') >= '201203' and DATE_FORMAT(order_date, '%Y%m') <= '201203' and order_status = 'SHIPPED' and item_status = 'LINESHIPPED' 
group by order_id 
order by order_id 
+0

謝謝格林聯,當您回到辦公室時會嘗試 – KevInSol 2012-07-31 19:58:41

+0

您可能必須將group_concat在子查詢中使用了IFNULL,我不記得CONCAT如何在MySQL中處理NULL值Oracle將它們視爲空字符串 – 2012-07-31 23:42:43

+0

非常感謝greenline爲您的所有努力 - 它似乎完美工作我剛更改了IFNULL((select sum (option_cost)到IFNULL((select sum(option_cost * ordered_qty))是的,我確實需要IFNULL作爲「CONCAT()返回NULL,如果任何參數爲NULL」從文檔。再次感謝,凱文 – KevInSol 2012-08-01 10:41:06