Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Truy vấn động trong MySQL

Để có được kết quả mong muốn, bạn cần phải bỏ chia sẻ dữ liệu hiện tại từ các cột thành hàng và sau đó xoay vòng year dữ liệu từ hàng thành cột.

MySQL không có hàm PIVOT hoặc UNPIVOT, vì vậy bạn sẽ cần sử dụng UNION ALL truy vấn để bỏ chia và một hàm tổng hợp với CASE biểu thức thành pivot.

Nếu bạn có một số lượng giá trị đã biết, thì bạn có thể mã hóa các giá trị tương tự như sau:

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;

Xem SQL Fiddle với Demo .

Nhưng nếu bạn sắp có một số lượng giá trị không xác định, thì bạn sẽ cần sử dụng một câu lệnh đã chuẩn bị để tạo SQL động. Mã sẽ tương tự như sau:

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;

Xem SQL Fiddle with Demo . Kết quả cho cả hai truy vấn là:

| 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. cách đặt độ dài của cột ở chế độ ngủ đông với độ dài tối đa

  2. cách xóa các giá trị trùng lặp trong bảng mysql

  3. Cấp phát bộ nhớ MySQL TEXT

  4. SQLAlchemy JSON dưới dạng blob / text

  5. tải tệp lên MySql DB bằng PHP