MySQL Select Query 生成动态列结果

Vij*_*jay 3 mysql sql pivot-table aggregate-functions case-when

我需要编写一个动态返回列的查询。例如,我有一个包含列的表 tblTest:

Id, Name,   Type,  Amount
1, Receipt, Cash   100
2, Receipt, Card   200
3, Receipt, Cheque 250
4, Receipt, Card   150
5, Receipt, Cash   100
6, Payment, Cash   300
7, Payment, Cheque 400
Run Code Online (Sandbox Code Playgroud)

SQL查询:

SELECT
    Name,
    SUM(CASE WHEN Type = 'Cash'   THEN Amount ELSE 0 END) Cash,
    SUM(CASE WHEN Type = 'Card'   THEN Amount ELSE 0 END) Card,
    SUM(CASE WHEN Type = 'Cheque' THEN Amount ELSE 0 END) Cheque
FROM tblTest
GROUP BY
    Name;
Run Code Online (Sandbox Code Playgroud)

它返回我,

在此输入图像描述

上面的结果是按照我的要求,但在我的情况下,上面数据中的类型现金、卡、支票等不是预定义的,它们可能是动态出现的,那么我如何管理它,请帮助我为此构建动态列 SQL。

提前致谢..

D-S*_*hih 6

您需要使用动态枢轴

动态创建数据透视查询。

主要步骤如下

  1. 声明一个变量@sql来携带您的SUM函数和CASW WHEN表达式
  2. 用于CONCAT组合您的SUM函数和CASW WHEN表达式字符串和主select字符串。
  3. 使用EXECUTE函数动态执行 SQL。

看起来像这样。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'SUM(CASE WHEN Type =''',
      Type,
      ''' THEN Amount END) AS ',
      Type
    )
  ) INTO @sql
FROM tblTest;

SET @sql = CONCAT('SELECT
                    Name,', @sql, ' 
                   FROM tblTest
                   GROUP BY
                    Name;');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Run Code Online (Sandbox Code Playgroud)

结果

    Name    Cash    Card    Cheque
1   Payment 300     NULL    400
2   Receipt 200      350    250
Run Code Online (Sandbox Code Playgroud)

SQL小提琴