如何解决带有 CASE 和 LIKE 语句的 SQL Unpivot
正在寻找一些帮助来取消透视与附加图像相似的表格。 我有两种类型的列名称,标题中带有“Sales”或“Staff”,我想将它们合并到仅用于 Sales 和 Staff 的列中。 理想情况下,这将是动态完成的,这样我就不会指定单个列名,而只是我要搜索的标准。 区域也可以是动态的,也可以通过加入一个单独的度量 -> 区域映射表来完成。
解决方法
通用解决方案使用 union all
:
select period,channel,'East' as region,east_sales as sales,east_staff as staff
from t
union all
select period,'West' as region,west_sales as sales,west_start as staff
from t;
但是,在支持横向连接的数据库中,我建议改为使用横向连接。
,您可以像下面这样使用 unpivot
:
DECLARE
@col_Sales NVARCHAR(MAX) = N'',@col_Staff NVARCHAR(MAX) = N'',@sql NVARCHAR(MAX) = N'';
--different types of columns extraction
SELECT @col_Sales += ',' + QUOTENAME(name)
FROM sys.columns
WHERE [object_id] = OBJECT_ID('temptable')
AND name like '%Sales%';
SELECT @col_Staff += ',' + QUOTENAME(name)
FROM sys.columns
WHERE [object_id] = OBJECT_ID('temptable')
AND name like '%Staff%';
--dynamic sql
SET @sql = N'SELECT [Period],Channel,replace(Region,''_Sales'','''') as Region,Staff,Sales
FROM
(
SELECT *
FROM temptable
) AS t
UNPIVOT
(
Sales FOR Region IN (' + STUFF(@col_Sales,1,'') + ')
) AS up1
UNPIVOT
(
Staff FOR Staffs IN (' + STUFF(@col_Staff,'') + ')
) AS up2
where replace(Region,''sales'','''') = replace(Staffs,''staff'','''') --crucial condition
;';
PRINT @sql;
exec sp_executesql @sql;
请找到数据库小提琴here。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。