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

Xoay bảng MySQL với các cột động

Tôi đoán month_payment của bạn cột là DATE (btw, nên đăng SHOW CREATE TABLE khi bạn đặt câu hỏi SQL để chúng tôi không phải đoán).

Nhưng truy vấn đầu tiên của bạn không định dạng năm / tháng. Nó cũng không giới hạn phạm vi ngày.

SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'SUM(CASE WHEN EXTRACT(YEAR_MONTH FROM month_payment) = ',
      EXTRACT(YEAR_MONTH FROM month_payment),
      ' THEN AMOUNT END) AS `',
      EXTRACT(YEAR_MONTH FROM month_payment),
      '`'
    )
  ) INTO @sql
FROM record_payment
WHERE month_payment BETWEEN ? AND ?

Xem https:// dev. mysql.com/doc/refman/5.7/en/date-and-time-functions.html# Chức năng_extract

Bất chấp lời đề nghị của Barmar, không có lý do gì để đưa điều này vào một quy trình được lưu trữ. Bạn đã gắn thẻ câu hỏi của mình bằng PHP và bạn có thể thực hiện việc này bằng PHP rất tốt:

<?php

...get a PDO connection...

$sql = "
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'SUM(CASE WHEN EXTRACT(YEAR_MONTH FROM month_payment) = ',
          EXTRACT(YEAR_MONTH FROM month_payment),
          ' THEN AMOUNT END) AS `',
          EXTRACT(YEAR_MONTH FROM month_payment),
          '`'
        )
      ) AS `pivot_columns`
    FROM record_payment
    WHERE month_payment BETWEEN ? AND ?
";
$stmt = $pdo->prepare($sql);
$date_from = '2017-01-01';
$date_to   = '2017-08-01';
$stmt->execute([$date_from, $date_to]);
$row = $stmt->fetch();
$stmt->closeCursor();
$pivot_columns = $row['pivot_columns'];

$sql = "
    SELECT title AS `Payment Method`, {$pivot_columns}
    FROM record_payment t1
    JOIN setting_payment_method spm ON spm.id = t1.method_id
    WHERE month_payment BETWEEN ? AND ?
    GROUP BY title WITH ROLLUP
";
echo $sql;
$stmt = $pdo->prepare($sql);
$stmt->execute([$date_from, $date_to]);
$results = $stmt->fetchAll();
$stmt->closeCursor();

print_r($results);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL đếm giá trị cụ thể trên nhiều cột và hàng

  2. Python:MySQL:Xử lý thời gian chờ

  3. Lỗi kết nối MySQL RDS và JDBC SSL:không thể tìm thấy đường dẫn chứng nhận hợp lệ đến mục tiêu được yêu cầu

  4. Sắp xếp theo ngày (mới nhất)

  5. Chương trình MySQL mysql_tzinfo_to_sql