您正在寻找Dynamics pivot。
主要步骤如下
- 声明变量
@sqlX 和 @sqlY 以承载您的 MAX 函数和 CASW WHEN 表达式以创建 X 和 Y 枢轴列。
- 使用
CONCAT 将您的SUM 函数和CASW WHEN 表达式字符串和主选择字符串以及UNION ALL @sqlX 和@sqlY 查询字符串结合起来。
- 使用
EXECUTE函数动态执行SQL。
TestDLL
CREATE TABLE T(
SrNo INT,
X VARCHAR(100),
Y INT
);
INSERT INTO T VALUES (1,'N1',100);
INSERT INTO T VALUES (2,'N2',200);
INSERT INTO T VALUES (3,'N3',300);
INSERT INTO T VALUES (4,'N4',400);
INSERT INTO T VALUES (5,'N5',500);
INSERT INTO T VALUES (6,'N6',600);
INSERT INTO T VALUES (7,'N7',700);
这里是mysql示例。
SET @sqlX = NULL;
SET @sqlY = NULL;
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(CASE WHEN SrNo =',
SrNo,
' THEN X END) '
)
) INTO @sqlX
FROM T;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(CASE WHEN SrNo =',
SrNo,
' THEN Y END) '
)
) INTO @sqlY
FROM T;
SET @sql = CONCAT('SELECT ''X'', ', @sqlX, '
FROM T
UNION ALL
SELECT ''Y'', ', @sqlY, '
FROM T
');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Mysql sqlfiddle
SQL-Server 版本
DECLARE @sqlX VARCHAR(MAX)
DECLARE @sqlY VARCHAR(MAX)
DECLARE @sql VARCHAR(MAX)
SET @sqlX = STUFF((SELECT distinct ', CAST( MAX(CASE WHEN SrNo =' + CAST(SrNo AS VARCHAR(5)) + ' THEN X END) AS VARCHAR(MAX)) '
FROM T
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
SET @sqlY = STUFF((SELECT distinct ',CAST( MAX(CASE WHEN SrNo = ' + CAST(SrNo AS VARCHAR(5)) + ' THEN Y END) AS VARCHAR(MAX)) '
FROM T
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
set @sql = CONCAT('SELECT ''X'', ', @sqlX, '
FROM T
UNION ALL
SELECT ''Y'', ', @sqlY, '
FROM T');
execute(@sql)
sqlserver sqlfiddle
结果
| X | MAX(CASE WHEN SrNo =1 THEN X END) | MAX(CASE WHEN SrNo =2 THEN X END) | MAX(CASE WHEN SrNo =3 THEN X END) | MAX(CASE WHEN SrNo =4 THEN X END) | MAX(CASE WHEN SrNo =5 THEN X END) | MAX(CASE WHEN SrNo =6 THEN X END) | MAX(CASE WHEN SrNo =7 THEN X END) |
|---|-----------------------------------|-----------------------------------|-----------------------------------|-----------------------------------|-----------------------------------|-----------------------------------|-----------------------------------|
| X | N1 | N2 | N3 | N4 | N5 | N6 | N7 |
| Y | 100 | 200 | 300 | 400 | 500 | 600 | 700 |
注意:
T 可以代替您的子查询或当前结果集。