Teradata中多列SQL Pivot实现方法咨询
多列Pivot实现思路(针对BOM/EOM日期快照)
核心思路
要实现多维度(日期类型+日期)的行转列,关键是先把**日期类型(BOM/EOM)和快照日期的标识(如年月)**合并成一个新的复合列,再基于这个复合列做单列Pivot;或者用CASE WHEN的方式直接生成目标列。
方法一:Excel环境下操作
- 添加辅助列:在原数据中新增一列,公式示例:
=B2&"_"&TEXT(C2,"YYYYMM")(假设B列是日期类型,C列是快照日期),生成类似BOM_202301、EOM_202301的复合列名。 - 插入数据透视表:选中所有数据,插入透视表,将「物料号」拖到行区域,辅助列拖到列区域,「计划日期」拖到值区域(值字段设置为「最大值」或「最小值」,因为每个物料+复合列的组合对应唯一日期)。
- 整理布局:调整列标签顺序,按需删除多余字段,即可得到目标格式。
方法二:SQL环境下操作
方案A:用PIVOT函数(需先构造复合列)
以SQL Server为例,先把日期类型和快照年月拼接成新列,再做Pivot:
SELECT Material_Number, [BOM_202301], [EOM_202301], [BOM_202302], [EOM_202302] -- 按需列出所有需要的复合列名 FROM ( -- 子查询构造复合列 SELECT Material_Number, CONCAT(Date_Type, '_', FORMAT(Snapshot_Date, 'yyyyMM')) AS Pivot_Col, Plan_Date FROM YourTableName ) AS SourceData PIVOT ( MAX(Plan_Date) -- 用MAX聚合,因为每个组合唯一 FOR Pivot_Col IN ([BOM_202301], [EOM_202301], [BOM_202302], [EOM_202302]) ) AS PivotResult;
如果日期范围不固定,可使用动态SQL自动生成列名列表。
方案B:用CASE WHEN(更灵活,无需PIVOT函数)
直接通过条件判断生成目标列,适合固定日期范围的场景:
SELECT Material_Number, MAX(CASE WHEN Date_Type='BOM' AND FORMAT(Snapshot_Date,'yyyyMM')='202301' THEN Plan_Date END) AS BOM_202301, MAX(CASE WHEN Date_Type='EOM' AND FORMAT(Snapshot_Date,'yyyyMM')='202301' THEN Plan_Date END) AS EOM_202301, MAX(CASE WHEN Date_Type='BOM' AND FORMAT(Snapshot_Date,'yyyyMM')='202302' THEN Plan_Date END) AS BOM_202302, MAX(CASE WHEN Date_Type='EOM' AND FORMAT(Snapshot_Date,'yyyyMM')='202302' THEN Plan_Date END) AS EOM_202302 FROM YourTableName GROUP BY Material_Number;
内容的提问来源于stack exchange,提问作者Dongaldo
相关产品推荐
相关产品推荐

