2012-08-03 82 views
4

我已经包含了产品的表的数据库命令是这样的:SQLITE - 转置行转换成列正确

order_id | prod_code | prod_color | size | quantity | 
----------------------------------------------------- 
1   SHIRT  001   S  10 
1   SHIRT  001   M  7 
1   SHIRT  001   L  8 
1   SHIRT  001   XL  1 
1   SHIRT  995   S  2 
1   SHIRT  995   M  1 
1   SHIRT  995   L  0 
1   SHIRT  995   XL  1 
2   PANTS  .... 

和产品的价格表如下:

prod_code | prod_color | price | currency 
----------------------------------------- 
SHIRT  001   10  EUR 
SHIRT  001   9  USD 
SHIRT  001   50  YEN 
SHIRT  001   15  RUB 
SHIRT  995   20  EUR 
SHIRT  995   29  USD 
SHIRT  995   100  YEN 
SHIRT  995   45  RUB 
PANTS  .... 

什么,我想想获得,是(通过ORDER_ID过滤为简单起见)这样的观点:

order_id | prod_code | prod_color | size | quantity | EUR | USD | YEN | RUB 
--------------------------------------------------------------------------- 
1   SHIRT  001   S  10   10 9  50 15 
1   SHIRT  001   M  7   10 9  50 15 
1   SHIRT  001   L  8   10 9  50 15 
1   SHIRT  001   XL  1   10 9  50 15 
1   SHIRT  995   S  2   20 29 100 45 
1   SHIRT  995   M  1   20 29 100 45 
1   SHIRT  995   L  0   20 29 100 45 
1   SHIRT  995   XL  1   20 29 100 45 

我已经通过网络看并通过SO,我发现THIS QUESTION,显示我正是我需要做的,但我认为有一些修改...

我tryed到数据库上运行此查询:

SELECT o.order_id, o.prod_code, o.prod_color, o.size, o.quantity, 
MAX(CASE WHEN p.currency = 'EUR' THEN p.price END) AS 'EUR', 
MAX(CASE WHEN p.currency = 'USD' THEN p.price END) AS 'USD', 
MAX(CASE WHEN p.currency = 'YEN' THEN p.price END) AS 'YEN', 
MAX(CASE WHEN p.currency = 'RUB' THEN p.price END) AS 'RUB' 
FROM products_order o JOIN products_prices p ON o.prod_code = p.prod_code 
WHERE o.order_id = 1 
GROUP BY o.order_id, o.prod_code, o.prod_color, o.size, o.quantity 

将返回在价格列中,对于每一行,在整列中找到最大值:所以对于[product_color = 001]和[product_color = 995],我的价格等于20欧元(当001价格便宜时,只有10欧元!)

我尝试过也没有MAX,但它给了我一行的每个价格,留下很多单元格为空(然后我明白什么是用于MAX: d)。

你知道一种方法来做我想做的事吗?我如何在一个prod_color中使用MAX,而不是通过每个prod_color?

我希望你能理解我写的,在此先感谢,任何帮助表示感谢。

(如果你需要的东西解释的更清楚,只问和我尽快回复会再次

感谢,问候

+2

SQLFiddle:http://sqlfiddle.com/#!5/fadad – biziclop 2012-08-03 17:24:12

回答

7

我增加了一个额外JOIN条件:AND o.prod_color = p.prod_color

http://sqlfiddle.com/#!5/fadad/5

SELECT 
    o.order_id, o.prod_code, o.prod_color, o.size, o.quantity, 
    MAX(CASE WHEN p.currency = 'EUR' THEN p.price END) AS 'EUR', 
    MAX(CASE WHEN p.currency = 'USD' THEN p.price END) AS 'USD', 
    MAX(CASE WHEN p.currency = 'YEN' THEN p.price END) AS 'YEN', 
    MAX(CASE WHEN p.currency = 'RUB' THEN p.price END) AS 'RUB' 

FROM products_order o 
JOIN products_prices p 
    ON o.prod_code = p.prod_code 
AND o.prod_color = p.prod_color /* this line is added */ 

WHERE o.order_id = '1' 
GROUP BY 
    o.order_id, 
    o.prod_code, 
    o.prod_color, 
    o.size, 
    o.quantity 

没有GROUP BY的简单示例查询显示di fference:

http://sqlfiddle.com/#!5/fadad/13

+0

是这样真棒感谢很多人! – 2016-03-19 11:29:35