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

mysql पिवट तालिका दिनांक (क्षैतिज डेटा के लिए लंबवत)

यह परिणाम प्राप्त करने के लिए, आप पिवट . करना चाहेंगे आंकड़ा। MySQL में पिवट फ़ंक्शन नहीं है लेकिन आप CASE . के साथ एक समग्र फ़ंक्शन का उपयोग कर सकते हैं अभिव्यक्ति।

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

select client_id,
  max(case when rownum = 1 then date end) Date1,
  max(case when rownum = 2 then date end) Date2,
  max(case when rownum = 3 then date end) Date3
from
(
  select client_id,
    date,
    @row:=if(@prev=client_id, @row,0) + 1 as rownum,
    @prev:=client_id 
  from yourtable, (SELECT @row:=0, @prev:=null) r
  order by client_id, date
) s
group by client_id
order by client_id, date

देखें SQL Fiddle with Demo

मैंने client_id . के भीतर प्रत्येक रिकॉर्ड के लिए एक पंक्ति संख्या निर्दिष्ट करने के लिए उपयोगकर्ता चर लागू किए हैं समूह।

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

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN rownum = ',
      rownum,
      ' THEN date END) AS Date_',
      rownum
    )
  ) INTO @sql
from
(
  select client_id,
    date,
    @row:=if(@prev=client_id, @row,0) + 1 as rownum,
    @prev:=client_id 
  from yourtable, (SELECT @row:=0) r
  order by client_id, date
) s
order by client_id, date;


SET @sql 
  = CONCAT('SELECT client_id, ', @sql, ' 
           from
           (
             select client_id,
               date,
               @row:=if(@prev=client_id, @row,0) + 1 as rownum,
               @prev:=client_id 
             from yourtable, (SELECT @row:=0) r
             order by client_id, date
           ) s
           group by client_id
           order by client_id, date');

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

देखें SQL Fiddle with Demo

वे दोनों परिणाम देते हैं:

| CLIENT_ID |                          DATE_1 |                          DATE_2 |                     DATE_3 |
--------------------------------------------------------------------------------------------------------------
|         1 | February, 03 2013 00:00:00+0000 | February, 10 2013 00:00:00+0000 | May, 12 2013 00:00:00+0000 |
|         2 | February, 03 2013 00:00:00+0000 |     July, 15 2013 00:00:00+0000 |                     (null) |



  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 तालिका में ट्री पथ प्राप्त करें

  2. समान कॉलम नामों वाली दो तालिकाओं से डेटा

  3. MySQL IFNULL अन्य

  4. MySQL MyISAM तालिका प्रदर्शन समस्या पर दोबारा गौर किया गया

  5. PHP/MySQL पंक्ति डालें फिर 'आईडी' प्राप्त करें