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

Truy vấn Mysql để chuyển đổi động các hàng thành cột trên cơ sở hai cột

Nếu bạn có một số giá trị đã biết cho cả orderitem , sau đó bạn có thể viết mã truy vấn thành:

select id,
  max(case when `order` = 1 then data end) order1,
  max(case when `order` = 2 then data end) order2,
  max(case when `order` = 3 then data end) order3,
  max(case when item = 1 then price end) item1,
  max(case when item = 2 then price end) item2,
  max(case when item = 3 then price end) item3,
  max(case when item = 4 then price end) item4
from tableA
group by id;

Xem Demo . Nhưng một phần của vấn đề mà bạn sẽ gặp phải là do bạn đang cố gắng chuyển đổi nhiều cột dữ liệu. Đề xuất của tôi để có được kết quả cuối cùng là bỏ chia dữ liệu trước. MySQL không có chức năng hủy chia nhưng bạn có thể sử dụng UNION ALL để chuyển đổi nhiều cặp cột thành hàng. Mã để bỏ chia sẻ sẽ tương tự như sau:

select id, concat('order', `order`) col,  data value
from tableA
union all
select id, concat('item', item) col, price value
from tableA;

Xem Demo . Kết quả của việc này sẽ là:

| ID |    COL | VALUE |
-----------------------
|  1 | order1 |     P |
|  1 | order1 |     P |
|  1 | order1 |     P |
|  1 |  item1 |    50 |
|  1 |  item2 |    60 |
|  1 |  item3 |    70 |

Như bạn có thể thấy, điều này đã chiếm nhiều cột của order / dataitem / price và chuyển nó thành nhiều hàng. Sau khi hoàn thành, bạn có thể chuyển đổi các giá trị trở lại thành cột bằng cách sử dụng hàm tổng hợp với CASE:

select id, 
  max(case when col = 'order1' then value end) order1,
  max(case when col = 'order2' then value end) order2,
  max(case when col = 'order3' then value end) order3,
  max(case when col = 'item1' then value end) item1,
  max(case when col = 'item2' then value end) item2,
  max(case when col = 'item3' then value end) item3
from
(
  select id, concat('order', `order`) col,  data value
  from tableA
  union all
  select id, concat('item', item) col, price value
  from tableA
) d
group by id;

Xem Demo . Cuối cùng, bạn cần chuyển đoạn mã trên thành một truy vấn câu lệnh chuẩn bị động:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when col = ''',
      col,
      ''' then value end) as `', 
      col, '`')
  ) INTO @sql
FROM
(
  select concat('order', `order`) col
  from tableA
  union all
  select concat('item', `item`) col
  from tableA
)d;

SET @sql = CONCAT('SELECT id, ', @sql, ' 
                  from
                  (
                    select id, concat(''order'', `order`) col,  data value
                    from tableA
                    union all
                    select id, concat(''item'', item) col, price value
                    from tableA
                  ) d
                  group by id');

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

Xem SQL Fiddle với bản trình diễn . Điều này cho kết quả:

| ID | ORDER1 | ORDER2 | ORDER3 | ITEM1 | ITEM2 |  ITEM3 |  ITEM4 |
-------------------------------------------------------------------
|  1 |      P |      Q | (null) |    50 |    60 |     70 | (null) |
|  2 |      P | (null) |      S |    50 |    60 | (null) |     80 |



  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ác loại trong MySQL:BigInt (20) so với Int (20)

  2. Chèn vào bảng MySQL hoặc cập nhật nếu tồn tại

  3. Cách đặt lại mật khẩu gốc MySQL hoặc MariaDB trong Linux

  4. Kết nối với MySQL bằng Python

  5. MySQL Workbench:Cách giữ kết nối tồn tại