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

3
我需要编写一个查询,动态返回列。例如,我有一个名为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

上述结果符合我的要求,但在我的情况下,以上数据中的现金、卡、支票等类型不是预定义的,可能会动态出现,那么我该如何管理它,请帮助我构建动态列 SQL。
提前感谢。

“动态”是什么意思?你的意思是当数据库发生变化时,SUM会重新计算并且HTML会被重写吗? - Yuri
在上述表格中,列类型的值现金、卡片、支票并没有预定义,它可能会随着Paytm、钱包等的增加而增加... - Vijay
考虑在应用程序代码中处理数据显示问题。这样会更简单。 - Strawberry
动态构建器 - Rick James
您可以使用 for 循环创建查询字符串,然后稍后执行。 - Vipin Choubey
2个回答

6

你需要使用 动态透视表

动态创建你的 透视表 查询。

主要步骤如下:

  1. 声明一个变量 @sql 来存储你的 SUM 函数和 CASE WHEN 表达式。
  2. 使用 CONCAT 函数将你的 SUM 函数和 CASE 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;

结果

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

SQLfiddle


-1

你好,

希望我理解得没错。

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接