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。
提前致谢..
您需要使用动态枢轴
动态创建数据透视查询。
主要步骤如下
@sql来携带您的SUM函数和CASW WHEN表达式CONCAT组合您的SUM函数和CASW WHEN表达式字符串和主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;
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)