数据库
首页 > 数据库> > MySQL选择查询以生成动态列结果

MySQL选择查询以生成动态列结果

作者:互联网

我需要编写一个查询,以动态返回列.例如,我有一个带有列的表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

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;

它返回我,

enter image description here

以上结果是根据我的要求,但在我的情况下,上述数据中的Cash,Card,Cheque等类型不是预定义的,可能是动态产生的,那么我该如何管理它,请帮我建立动态列SQL.

提前致谢..

解决方法:

您需要使用动态数据透视

动态创建您的数据透视查询.

主要步骤如下

>声明一个变量@sql以携带SUM函数和CASW WHEN表达式
>使用CONCAT组合SUM函数和CASW WHEN表达式字符串和主选择字符串.
>使用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;

结果

    Name    Cash    Card    Cheque
1   Payment 300     NULL    400
2   Receipt 200      350    250

SQLfiddle

标签:case-when,aggregate-functions,pivot-table,sql,mysql
来源: https://codeday.me/bug/20191025/1925775.html