sql - 在Sql中将水平表转换为垂直表
问题描述
我有以下表格格式:
我需要将此表转换为以下格式:
我在其他问题中寻找 PIVOT 函数,但输入表中的“键”值不是一组固定的值,它们可以是任何值。我还寻找了其他此类问题,但我不确定应该如何编写查询。
我的代码是:
SELECT
ROW_NUMBER () OVER (
ORDER BY RouteCode) AS SrNo
, RouteCode AS X
, SUM(Units) AS Y
FROM
[ INTERFACE_ok ] .[ dbo ] .[ v_A40OrdersBhQt ]
WHERE [ DeliveryDate ] > CAST(
FLOOR(CAST(GETDATE () AS FLOAT)) AS DATETIME
)
AND CustomerCode LIKE '900%'
GROUP BY [ RouteCode ]
任何帮助将不胜感激,谢谢!
解决方案
您正在寻找Dynamics pivot。
主要步骤如下
- 声明变量
@sqlX
并@sqlY
携带您的MAX
函数和CASW WHEN
表达式来创建X
和Y
透视列。 - 用于
CONCAT
组合您的 SUM 函数和 CASW WHEN 表达式字符串和主选择字符串UNION ALL
@sqlX
以及@sqlY
查询字符串。 - 使用
EXECUTE
函数动态执行 SQL。
测试DLL
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;
SQL 服务器版本
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)
结果
| 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
可以代替您的子查询或当前结果集。
推荐阅读
- c# - Web API 从缓冲区流式传输图像
- codenameone - 防止 Netbeans 中的错误导入
- angular - 在 CKEditor 中获取插入符号位置
- sockets - C - 在 socketCAN 的广播管理器上发送循环消息
- c++ - 如何使用 C++ 编写具有多级指针的进程内存?
- html - 单击锚点后如何刷新页面并加载到顶部,忽略锚点并重置回顶部?
- amazon-web-services - AWS API 网关。入口点资源上的 Lambda 代理集成以操作数据,然后转发到所有后续资源
- react-native - 如何在 react-native 的循环内创建动态选择器?
- spring - 如何在基于 SpringBoot 的服务的 JUnit 测试中注入 Validator?
- angular - 如何在引导模式的高图中展开相同的图表 onclick 角度 6 中的缩略图图表