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

Truy vấn SQL để tạo lại bảng bằng cách sử dụng dữ liệu hàng động của nó cho tên cột

Về cơ bản đây là một PIVOT nhưng MySQL không có chức năng PIVOT. Vì vậy, bạn sẽ muốn sao chép điều này bằng cách sử dụng hàm tổng hợp và CASE bản tường trình. Nếu bạn biết số Grant các giá trị mà bạn có thì bạn có thể mã hóa truy vấn tương tự như sau:

select 
  Month,
  sum(case when `grant`='DOE' then subtotal else 0 end) DOE,
  sum(case when `grant`='Hatch' then subtotal else 0 end) Hatch,
  sum(case when `grant`='NIH' then subtotal else 0 end) NIH,
  sum(case when `grant`='NSF' then subtotal else 0 end) NSF,
  sum(case when `grant`='Other' then subtotal else 0 end) Other,
  sum(case when `grant`='State' then subtotal else 0 end) State
from yourtable
group by month

Xem SQL Fiddle with Demo

Bây giờ, nếu bạn có một số lượng giá trị không xác định cho Grant , thì bạn có thể sử dụng một câu lệnh đã chuẩn bị để tạo phiên bản động của truy vấn này:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'sum(case when `Grant` = ''',
      `Grant`,
      ''' then Subtotal else 0 end) AS `',
      `Grant`, '`'
    )
  ) INTO @sql
FROM yourtable;


SET @sql = CONCAT('SELECT month, ', @sql, ' 
                  FROM yourtable 
                  group by month');


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

Xem SQL Fiddle with Demo

Cả hai đều tạo ra cùng một kết quả:

|    MONTH |  HATCH |   NIH |    NSF |  OTHER |    DOE |  STATE |
-----------------------------------------------------------------
| Nov-2012 | 144.56 | 240.9 |  100.7 | 276.67 |      0 |      0 |
| Oct-2012 | 321.54 |     0 | 234.53 | 312.35 | 214.35 |      0 |
| Sep-2012 | 147.99 |     0 | 156.89 | 245.67 |      0 | 148.66 |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ký tự Utf-8 được hiển thị dưới dạng ISO-8859-1

  2. Khóa ngoại MySQL InnoDB giữa các cơ sở dữ liệu khác nhau

  3. Hàng nào (theo thứ tự theo một số cột) trong bảng tương ứng với hàng trong bảng khác?

  4. đặt hàng theo XXX sắp xếp theo ASC hoặc DESC, đặt hàng động, mysql ...

  5. Khi nào sử dụng phép nối bên trái?