如何使用T-SQL将数据库表转换为指定透视表布局?
使用T-SQL PIVOT实现表格转置方案
核心思路
要实现你需要的布局,得先做**逆透视(UNPIVOT)把原表的数值列转成指标行,再做透视(PIVOT)**把日期列转成横向的日期字段。既然你明确每个项目的slver_date数量固定,直接写死日期列名即可,不用动态处理。
具体实现代码
假设你的原表名为OriginalInventoryTable,包含项目标识字段(比如item_code)、slver_date以及所有需要转换的数值字段,执行以下T-SQL语句:
SELECT metric_name, [2024-01-01] AS [2024-01-01], -- 替换为你的实际日期,按需添加更多日期列 [2024-01-08] AS [2024-01-08], [2024-01-15] AS [2024-01-15] FROM ( -- 第一步:逆透视,把数值列转成指标行,保留项目和日期关联 SELECT item_code, slver_date, CASE WHEN metric = 'oh_qty' THEN 'starting onhand' WHEN metric = 'firm_po' THEN 'Firm Purchase Order' WHEN metric = 'act_demand' THEN 'firm_demand' WHEN metric = 'tot_plan_trans_out' THEN 'Planned Transfer Out' WHEN metric = 'foh_ss' THEN 'FOH-SS' WHEN metric = 'ss_qrt' THEN 'Safety Stock Qty' WHEN metric = 'planned_purch' THEN 'Planned Purchase' END AS metric_name, metric_value FROM OriginalInventoryTable UNPIVOT ( metric_value FOR metric IN ( oh_qty, firm_po, act_demand, tot_plan_trans_out, foh_ss, ss_qrt, planned_purch ) ) AS unpvt ) AS src -- 第二步:透视,把日期转成横向列 PIVOT ( SUM(metric_value) -- 因每个项目+日期+指标唯一,用SUM/MAX结果一致 FOR slver_date IN ( [2024-01-01], [2024-01-08], [2024-01-15] -- 替换为你的实际日期列表 ) ) AS pvt ORDER BY metric_name; -- 按指标名称排序,可选
代码说明
- UNPIVOT部分:把原表中7个数值列拆分成
metric(原字段名)和metric_value(对应字段值)的行结构,同时用CASE把原字段名替换成你需要的显示名称。 - PIVOT部分:以
slver_date的具体值作为新列名,将每个指标在对应日期的数值填充到列中。 - 日期列处理:只需把
FOR slver_date IN()里的日期替换成你实际的slver_date值,有多少个日期就添加多少个。
如果原表没有项目标识字段(比如item_code),可以去掉外层查询的item_code;但如果存在多个项目,建议保留该字段并在SELECT和ORDER BY中包含,方便区分不同项目的指标数据。
内容的提问来源于stack exchange,提问作者Joseph Kyle Diel Mahasol
相关产品推荐
相关产品推荐

