Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

दो स्तंभों के आधार पर पंक्तियों को स्तंभों में गतिशील रूप से परिवर्तित करने के लिए MySQL क्वेरी

यदि आपके पास order . दोनों के लिए ज्ञात संख्या में मान हैं और item , तो आप इस क्वेरी को हार्ड कोड कर सकते हैं:

select id,
  max(case when `order` = 1 then data end) order1,
  max(case when `order` = 2 then data end) order2,
  max(case when `order` = 3 then data end) order3,
  max(case when item = 1 then price end) item1,
  max(case when item = 2 then price end) item2,
  max(case when item = 3 then price end) item3,
  max(case when item = 4 then price end) item4
from tableA
group by id;

देखें डेमो . लेकिन आपको जो समस्या होने वाली है उसका एक हिस्सा यह है कि आप डेटा के कई स्तंभों को बदलने की कोशिश कर रहे हैं। अंतिम परिणाम प्राप्त करने का मेरा सुझाव पहले डेटा को अनपिवट करना होगा। MySQL में एक unpivot फ़ंक्शन नहीं है, लेकिन आप स्तंभों के कई जोड़े को पंक्तियों में बदलने के लिए UNION ALL का उपयोग कर सकते हैं। अनपिवट करने के लिए कोड निम्न के जैसा होगा:

select id, concat('order', `order`) col,  data value
from tableA
union all
select id, concat('item', item) col, price value
from tableA;

देखें डेमो . इसका परिणाम होगा:

| ID |    COL | VALUE |
-----------------------
|  1 | order1 |     P |
|  1 | order1 |     P |
|  1 | order1 |     P |
|  1 |  item1 |    50 |
|  1 |  item2 |    60 |
|  1 |  item3 |    70 |

जैसा कि आप देख सकते हैं कि इसने order . के कई कॉलम ले लिए हैं /data और item /price और इसे कई पंक्तियों में परिवर्तित करें। एक बार यह पूरा हो जाने के बाद, आप CASE के साथ समग्र फ़ंक्शन का उपयोग करके मानों को वापस कॉलम में बदल सकते हैं:

select id, 
  max(case when col = 'order1' then value end) order1,
  max(case when col = 'order2' then value end) order2,
  max(case when col = 'order3' then value end) order3,
  max(case when col = 'item1' then value end) item1,
  max(case when col = 'item2' then value end) item2,
  max(case when col = 'item3' then value end) item3
from
(
  select id, concat('order', `order`) col,  data value
  from tableA
  union all
  select id, concat('item', item) col, price value
  from tableA
) d
group by id;

देखें डेमो . अंत में, आपको उपरोक्त कोड को एक गतिशील तैयार कथन क्वेरी में बदलने की आवश्यकता है:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when col = ''',
      col,
      ''' then value end) as `', 
      col, '`')
  ) INTO @sql
FROM
(
  select concat('order', `order`) col
  from tableA
  union all
  select concat('item', `item`) col
  from tableA
)d;

SET @sql = CONCAT('SELECT id, ', @sql, ' 
                  from
                  (
                    select id, concat(''order'', `order`) col,  data value
                    from tableA
                    union all
                    select id, concat(''item'', item) col, price value
                    from tableA
                  ) d
                  group by id');

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

देखें SQL Fiddle with डेमो . यह एक परिणाम देता है:

| ID | ORDER1 | ORDER2 | ORDER3 | ITEM1 | ITEM2 |  ITEM3 |  ITEM4 |
-------------------------------------------------------------------
|  1 |      P |      Q | (null) |    50 |    60 |     70 | (null) |
|  2 |      P | (null) |      S |    50 |    60 | (null) |     80 |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL तालिका में CSV फ़ाइल कैसे आयात करें

  2. MySQL InnoDB इतना धीमा क्यों है?

  3. पीडीओ mysql:कैसे पता चलेगा कि सम्मिलित सफल हुआ था

  4. संपूर्ण mysql डेटाबेस ढूंढें और बदलें

  5. DATE_ADD () उदाहरण – MySQL