简体   繁体   中英

Making Multiple Rows into Multiple columns in mysql

consider the following table

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

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

The Sample data are as follows

 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
.....

A Normal join query like this

 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

But the expected output should be like this

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

Hope iam clearer

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

If you have unknown number of value for PRONAME , a Dynamic SQL is much preferred so there will be no other alterations required on the query.

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;

THE OUTPUT from the queries above are the same:

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

If you are ok specifying everything statically, you can do this with a join on prodprop for each property you want to retrieve:

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

Otherwise, you are going to have to resort to dynamic SQL to create a custom query, or return the properties table as is, and do the formatting in the front end.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM