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

MySQL में डायनामिक क्वेरी

इच्छित परिणाम प्राप्त करने के लिए, आपको अनपिवट . दोनों की आवश्यकता होगी कॉलम से मौजूदा डेटा को पंक्तियों में बदलें और फिर year को पिवट करें पंक्तियों से कॉलम में डेटा।

MySQL में PIVOT या UNPIVOT फ़ंक्शन नहीं है, इसलिए आपको UNION ALL का उपयोग करना होगा अनपिवट करने के लिए क्वेरी और CASE . के साथ एक समग्र फ़ंक्शन धुरी के लिए अभिव्यक्ति।

यदि आपके पास मानों की एक ज्ञात संख्या है, तो आप इसके समान मानों को हार्ड-कोड कर सकते हैं:

select locid,
  event,
  max(case when year = 2011 then value end) `2011`,
  max(case when year = 2012 then value end) `2012`
from
(
  select LocId, Year, 'Birth' event, Birth value
  from yt
  union all
  select LocId, Year, 'Death' event, Death value
  from yt
  union all
  select LocId, Year, 'Abc' event, Abc value
  from yt
) d
group by locid, event;

देखें SQL Fiddle with Demo

लेकिन अगर आपके पास अज्ञात संख्या में मूल्य होने जा रहे हैं, तो आपको गतिशील एसक्यूएल उत्पन्न करने के लिए तैयार कथन का उपयोग करने की आवश्यकता होगी। कोड निम्न के जैसा होगा:

SET @sql = NULL;
SET @sqlUnpiv = NULL;
SET @sqlPiv = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'select locid, year, ''',
      c.column_name,
      ''' as event, ',
      c.column_name,
      ' as value 
      from yt '
    ) SEPARATOR ' UNION ALL '
  ) INTO @sqlUnpiv
FROM information_schema.columns c
where c.table_name = 'yt'
  and c.column_name not in ('LocId', 'Year')
order by c.ordinal_position;

SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(CASE WHEN year = ',
      year,
      ' THEN value else null END) AS `',
      year, '`'
    )
  ) INTO @sqlPiv
FROM yt;

SET @sql 
  = CONCAT('SELECT locid,
              event, ', @sqlPiv, ' 
            from 
            ( ',  @sqlUnpiv, ' ) d
            group by locid, event');

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

देखें SQL Fiddle with Demo . दोनों प्रश्नों का परिणाम है:

| LOCID | EVENT | 2011 | 2012 |
-------------------------------
|     1 |   Abc |   10 |   20 |
|     1 | Birth |  100 |   98 |
|     1 | Death |   60 |   70 |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. साधारण पुस्तकों की तालिका में डेटाबेस एकाधिक लेखकों को कैसे लिखें?

  2. यूटीएफ -8 के साथ django और mysql काम कैसे सेट करें?

  3. 1052:फ़ील्ड सूची में कॉलम 'आईडी' अस्पष्ट है

  4. mysqldump अज्ञात विकल्प कोई बीप नहीं

  5. MySQL/MariaDB में एक डेटाबेस को कैसे डिलीट करें