mysql select查询生成动态列结果

0aydgbwb  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(437)

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

它还给了我,

以上结果是根据我的要求,但在我的情况下,类型现金,卡,支票等,在上述数据不是预定义的,这可能是动态的,那么我如何管理它,请帮助我建立动态列sql的。
提前谢谢。。

pu82cl6c

pu82cl6c1#

你需要使用动态轴心
动态创建透视查询。
主要步骤如下
声明变量 @sql 带着你的 SUM 功能和 CASW WHEN 表达
使用 CONCAT 结合你的 SUM 功能和 CASW WHEN 表达式字符串和main select 字符串。
使用 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公司

lzfw57am

lzfw57am2#

嘿,
希望我没弄错。

select name, type, sum(CASE WHEN Type in (select DISTINCT sub.type from 
tblTest sub) THEN Amount ELSE 0 END) as "sum" from tblTest
group by name, type;

相关问题