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
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;
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 |