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

truy vấn bố cục ngang của dữ liệu mysql

Những gì bạn cần là một truy vấn Pivot. Vì MySQL không có câu lệnh cho điều đó, bạn sẽ cần phải viết nó "bằng tay" (chính xác hơn là tạo một biểu thức SQL động):

Vì vậy, nó có thể giống như thế này:

-- First you need to build the column list.
-- The "CASE ... END" expression will filter the data for each column
-- I use "max()" as an example; use whatever aggregate function you need.
select
  group_concat(distinct
    concat(
      'max(case when del_ProductID = ', del_productID, ' then del_id end) ',
      'as `del_productID-', del_productID, '` '
    )
  )
into @sql
from example;

-- Now build the full SELECT statement
set @sql = concat('SELECT del_date, ', @sql, ' from example group by del_date');


-- OPTIONAL: Check the SELECT statement you've just built
select @sql;

-- Prepare a statement using the SELECT statement built above
prepare stmt from @sql;
execute stmt;

-- When you are done, be sure to dealocate the prepared statement
deallocate prepare stmt;

Vui lòng xem ví dụ này trong SQL fiddle .

Lời giải thích

Bạn có thể nói "anh bạn, cái này trông khá phức tạp!" ... nhưng nó không phức tạp chút nào (chỉ tốn công thôi). Vậy, giải pháp trên hoạt động như thế nào?

Bước đầu tiên là xây dựng danh sách cột và một biểu thức để điền vào nó. group_concat() hàm sẽ nhận các giá trị hàng (hoặc biểu thức) và nối chúng, phân tách chúng bằng dấu phẩy. Bạn cần một hàm tổng hợp để hiển thị các giá trị trong kết quả của bảng tổng hợp. Tôi đã chọn max() làm ví dụ, nhưng bạn có thể sử dụng sum() , average() hoặc bất kỳ chức năng tổng hợp nào khác.

Đối với trường hợp case ... end bên trong hàm tổng hợp, bạn cần mỗi cột của bảng tổng hợp khớp với giá trị của del_productID , vì vậy, ví dụ:case when del_ProductID = 1 then del_id end sẽ trả về giá trị của del_id chỉ khi del_ProductID là 1 (sẽ trả về null trong bất kỳ trường hợp nào khác, bạn có thể thêm else 0 nếu bạn muốn trả về số 0 chẳng hạn).

select ... into sẽ lưu trữ kết quả của biểu thức vào một biến có tên là @sql .

Sau khi đã tạo danh sách cột, bạn cần viết phần còn lại của select câu lệnh ... đã xong với concat() chức năng.

Đối với phần còn lại, nó khá đơn giản:@sql là một chuỗi, vì vậy nếu bạn muốn thực thi nó, bạn cần tạo một câu lệnh chuẩn bị bằng cách sử dụng giá trị của nó (là một select câu lệnh) và thực thi nó.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. chèn nhiều trường bằng vòng lặp foreach

  2. Cách giải quyết Lỗi chung:Máy chủ MySQL 2006 đã biến mất

  3. Sequelize:Hoặc điều kiện trên nhiều bảng

  4. Chỉ có thể có một cột tự động

  5. Bảng ALTER - thêm AUTOINCREMENT trong MySQL