2013-03-25 27 views
0

考虑下表制作多行成多列在MySQL

Name          Null? Type 
----------------------------------------- -------- -------------- 
PRODID            NUMBER 
PRODNAME           VARCHAR2(50) 

Name          Null? Type 
----------------------------------------- -------- -------------- 
PRODID            NUMBER 
PROPID            NUMBER 
PRONAME           VARCHAR2(100) 
PROVALUE           VARCHAR2(100) 

样本数据如下

select * from prodmas; 
    PRODID PRODNAME 
---------- -------------- 
     101 Surf 
     102 Ariel 
select * from prodprop 
/

PRODID  PROPID PRONAME PROVALUE      
------ ---------- ----------------------------------------------- 
    101  1001 Price  100 
    101  1002 color  Blue 
    101  1003 Agent  AV 
    102  1001 Price  95 
    102  1002 Color  Orange 
..... 

一个普通的连接查询这样

select prodname,provalue 
from prodmas pm 
inner join prodprop pp 
on pm.prodid = pp.prodid 
/
PRODNAME           PROVALUE 
-------------------------------------------------- ----------- 
Surf            100 
Surf            Blue 
Surf            AV 
Ariel            95 
Ariel            Orange 

但预期产量应该是这样的

Surf 100 Blue AV 
Ariel 95 Orange AV 
....... 

希望IAM更清晰

回答

-2

如果你都OK指定的一切静态,你可以在prodprop联接每个属性要检索做到这一点:

SELECT p.prodname, 
    prop1001.provalue AS Price, 
    prop1002.provalue AS Color, 
    prop1003.provalue AS Agent 
FROM prodmas p 
LEFT OUTER JOIN prodprop prop1001 ON p.prodid = prop1001.prodid 
    AND prop1001.propid=1001 
LEFT OUTER JOIN prodprop prop1002 ON p.prodid = prop1002.prodid 
    AND prop1002.propid=1002 
LEFT OUTER JOIN prodprop prop1003 ON p.prodid = prop1003.prodid 
    AND prop1003.propid=1003 

否则,你要必须求助于动态SQL来创建自定义查询,或按原样返回属性表,并在前端执行格式化。

+0

有与原来的情形很多这样的特性,将它不会妨碍演出.. .. – user2202231 2013-03-25 08:50:50

4
SELECT a.ProdID, 
     a.ProdName, 
     MAX(CASE WHEN b.ProName = 'Price' THEN b.ProValue ELSE NULL END) Price, 
     MAX(CASE WHEN b.ProName = 'Color' THEN b.ProValue ELSE NULL END) Color, 
     MAX(CASE WHEN b.ProName = 'Agent' THEN b.ProValue ELSE NULL END) Agent 
FROM prodmas a 
     LEFT JOIN prodprop b 
      ON .prodID = b.prodID 
GROUP BY a.ProdID, a.ProdName 

如果你有未知数量的值PRONAME,动态SQL是更喜欢所以会出现对查询不再需要其他的改变。上述

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'MAX(case when PRONAME = ''', 
     PRONAME, 
     ''' then PROVALUE end) AS ', 
     PRONAME 
    ) 
) INTO @sql 
FROM prodprop; 

SET @sql = CONCAT('SELECT a.ProdID, 
          a.ProdName, ', @sql, ' 
        FROM prodmas a 
          LEFT JOIN prodprop b 
           ON a.prodID = b.prodID 
        GROUP BY a.ProdID, a.ProdName'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

输出从查询相同:

╔════════╦══════════╦═══════╦════════╦════════╗ 
║ PRODID ║ PRODNAME ║ PRICE ║ COLOR ║ AGENT ║ 
╠════════╬══════════╬═══════╬════════╬════════╣ 
║ 101 ║ Surf  ║ 100 ║ Blue ║ AV  ║ 
║ 102 ║ Ariel ║ 95 ║ Orange ║ (null) ║ 
╚════════╩══════════╩═══════╩════════╩════════╝ 
+0

让我测试这个在我原来的场景 – user2202231 2013-03-25 08:51:27

+0

好吧请问问你是否有更多的问题.. – 2013-03-25 08:56:11

+0

哇,你真的应该得到3分以上的赞扬 - 这是一个很好的解决方案!谢谢! – 2015-10-02 20:49:30