MS SQL Server中使用动态UNPIVOT实现列转行的方法咨询
MS SQL Server宽表转Tableau适配长表实现方案
你当前的需求是典型的宽表转长表场景,完全可以通过UNPIVOT实现,以下是两种可直接复用的实现方案:
方式1:静态实现(已提前获知所有财季列表)
如果你可以提前提供全部财季的字段列表,直接替换代码中对应部分即可使用:
SELECT 员工ID, 员工姓名, 部门, -- 此处替换为你实际的员工描述字段 LEFT(财季, CHARINDEX('_',财季)-1) AS 财季, Quota, Achievement FROM 你的原表名称 UNPIVOT ( Quota FOR 财季 IN ( FY23Q1_Quota, FY23Q2_Quota, FY23Q3_Quota, FY23Q4_Quota -- 此处替换为你所有财季的Quota字段名 ) ) AS unpvt_quota UNPIVOT ( Achievement FOR Ach_财季 IN ( FY23Q1_Achievement, FY23Q2_Achievement, FY23Q3_Achievement, FY23Q4_Achievement -- 此处替换为你所有财季的Achievement字段名 ) ) AS unpvt_ach WHERE LEFT(财季, CHARINDEX('_',财季)-1) = LEFT(Ach_财季, CHARINDEX('_',Ach_财季)-1)
说明:WHERE条件用于匹配同一财季的Quota和Achievement值,避免交叉关联生成错误数据。如果需要保留对应指标为NULL的行,可先将原表NULL值替换为0或其他占位值再执行UNPIVOT。
方式2:动态实现(自动适配后续新增财季字段)
如果后续会持续新增财季字段,只要保持字段命名规范为财季标识_Quota、财季标识_Achievement,就可以用动态SQL自动适配,无需每次手动修改代码:
DECLARE @sql NVARCHAR(MAX), @quota_cols NVARCHAR(MAX), @ach_cols NVARCHAR(MAX) -- 自动读取所有Quota字段 SELECT @quota_cols = COALESCE(@quota_cols + ',','') + QUOTENAME(name) FROM sys.columns WHERE object_id = OBJECT_ID('你的原表名称') AND name LIKE '%\_Quota' ESCAPE '\' -- 自动读取所有Achievement字段 SELECT @ach_cols = COALESCE(@ach_cols + ',','') + QUOTENAME(name) FROM sys.columns WHERE object_id = OBJECT_ID('你的原表名称') AND name LIKE '%\_Achievement' ESCAPE '\' -- 拼接执行SQL SET @sql = N' SELECT 员工ID, 员工姓名, 部门, -- 此处替换为你实际的员工描述字段 LEFT(财季, CHARINDEX(''_'',财季)-1) AS 财季, Quota, Achievement FROM 你的原表名称 UNPIVOT ( Quota FOR 财季 IN (' + @quota_cols + N') ) AS unpvt_quota UNPIVOT ( Achievement FOR Ach_财季 IN (' + @ach_cols + N') ) AS unpvt_ach WHERE LEFT(财季, CHARINDEX(''_'',财季)-1) = LEFT(Ach_财季, CHARINDEX(''_'',Ach_财季)-1) ' EXEC sp_executesql @sql
内容的提问来源于stack exchange,提问作者ghgma6
相关产品推荐
相关产品推荐

