【问题标题】:Converting SQL Server UNPIVOT to TERADATA将 SQL Server UNPIVOT 转换为 TERADATA
【发布时间】:2017-11-24 07:26:17
【问题描述】:

我正在尝试使用 UNPIVOT 逻辑将以下代码从 SQL Server 转换为 Teradata:

insert  into 
IPData
  select
  1,
ProductCode || '|' ||
LocationCode || '|' ||
TimeCode || '|' ||
MeasureCode || '|' ||
cast(MeasureVal as varchar(12))
from
(
 select
    p.SubsectionCode ProductCode,
    td_ss.LocationCode,
    td_ss.TimeCode,
    sum(
  case  
            when td_ss.Life = 'C' 
and td_ss.Seasonality = 'AW' then td_ss.DepotStockRetail
            else 0
        end) StkDep_AW_Act,
    sum(
 case   
            when td_ss.Life = 'C' 
and td_ss.Seasonality = 'C' then td_ss.DepotStockRetail
            else 0
        end) StkDep_Cnt_Act,
    sum(
 case   
            when td_ss.Life = 'C' 
and td_ss.Seasonality = 'SS' then td_ss.DepotStockRetail
            else 0
        end) StkDep_SS_Act,
    sum(
  case  td_ss.Life
            when 'T' then td_ss.DepotStockRetail
            else 0
        end) StkDep_Trm_Act,
    sum(td_ss.DepotStockRetail) StkDep_Tot_Act

from
    Stock td_ss
inner join
    Product p
on  td_ss.Kimball = p.CurrentKimball
and td_ss.SectArea = p.SectArea
and td_ss.SeasonID = p.SeasonID
group by
    p.SubsectionCode,
        td_ss.LocationCode,
        td_ss.TimeCode)x
UNPIVOT
    (MeasureVal for MeasureCode in
        (StkDep_AW_Act, StkDep_Cnt_Act, StkDep_SS_Act, StkDep_Trm_Act, StkDep_Tot_Act)) as unpvt

where
    MeasureVal <> 0;

我正在为UNPIVOT 的角色而苦苦挣扎。到目前为止,我在任何表格中都没有数据,因此非常感谢任何有关 UNPIVOT 的帮助。

【问题讨论】:

  • 如果您提供了样本数据和期望的结果,会更容易理解。

标签: sql-server teradata unpivot


【解决方案1】:

Teradata 在 TD16 中支持 UNPIVOT,但其语法更接近 Oracle 而不是 SQL Server。

TD_UNPIVOT 表运算符之前,这应该是正确的翻译:

INSERT  INTO 
IPData
SELECT * FROM TD_UNPIVOT(
ON(
   SELECT
        1,
      ProductCode || '|' ||
      LocationCode || '|' ||
      TimeCode || '|' ||
      MeasureCode || '|' ||
      Cast(MeasureVal AS VARCHAR(12))
   FROM

      (
       SELECT
          p.SubsectionCode ProductCode,
          td_ss.LocationCode,
          td_ss.TimeCode,
          Sum(
        CASE  
                  WHEN td_ss.Life = 'C' 
      AND td_ss.Seasonality = 'AW' THEN td_ss.DepotStockRetail
                  ELSE 0
              end) StkDep_AW_Act,
          Sum(
       CASE   
                  WHEN td_ss.Life = 'C' 
      AND td_ss.Seasonality = 'C' THEN td_ss.DepotStockRetail
                  ELSE 0
              end) StkDep_Cnt_Act,
          Sum(
       CASE   
                  WHEN td_ss.Life = 'C' 
      AND td_ss.Seasonality = 'SS' THEN td_ss.DepotStockRetail
                  ELSE 0
              end) StkDep_SS_Act,
          Sum(
        CASE  td_ss.Life
                  WHEN 'T' THEN td_ss.DepotStockRetail
                  ELSE 0
              end) StkDep_Trm_Act,
          Sum(td_ss.DepotStockRetail) StkDep_Tot_Act

      FROM
          Stock td_ss
      INNER JOIN
          Product p
      ON  td_ss.Kimball = p.CurrentKimball
      AND td_ss.SectArea = p.SectArea
      AND td_ss.SeasonID = p.SeasonID
      GROUP BY
          p.SubsectionCode,
              td_ss.LocationCode,
              td_ss.TimeCode)x
   ) AS dt
   USING
   VALUE_COLUMNS('MeasureVal')
   UNPIVOT_COLUMN('Measures')
   COLUMN_LIST('StkDep_AW_Act', 'StkDep_Cnt_Act', 'StkDep_SS_Act', 'StkDep_Trm_Act', 'StkDep_Tot_Act')
) AS unpvt

WHERE
    MeasureVal <> 0;

【讨论】:

    【解决方案2】:
         insert into IPData
                   select
                  1,
                  ProductCode || '|' ||
                  LocationCode || '|' ||
            TimeCode || '|' ||
            MeasureCode || '|' ||
            cast(MeasureVal as varchar(12))
         from
         (Select
                p.SubsectionCode ProductCode,
                td_ss.LocationCode,
                td_ss.TimeCode,
                sum(case 
                        when td_ss.Life = 'C' and td_ss.Seasonality = 'AW' then td_ss.DepotStockRetail
                        else 0
                    end) MeasureVal,'StkDep_AW_Act' AS MeasureCode
            FROM    Stock td_ss
            inner join
                Product p
            on  td_ss.Kimball = p.CurrentKimball
            and td_ss.SectArea = p.SectArea
            and td_ss.SeasonID = p.SeasonID
            group by
                p.SubsectionCode,
                td_ss.LocationCode,
                td_ss.TimeCode
                    having
            MeasureVal <> 0
         UNION ALL
            Select
                p.SubsectionCode ProductCode,
                td_ss.LocationCode,
                td_ss.TimeCode,
                sum(case 
                        when td_ss.Life = 'C' and td_ss.Seasonality = 'C' then td_ss.DepotStockRetail
                        else 0
                    end) MeasureVal, 'StkDep_Cnt_Act' AS MeasureCode
            FROM    Stock td_ss
            inner join
                Product p
            on  td_ss.Kimball = p.CurrentKimball
            and td_ss.SectArea = p.SectArea
            and td_ss.SeasonID = p.SeasonID
            group by
                p.SubsectionCode,
                td_ss.LocationCode,
                td_ss.TimeCode
                    having
            MeasureVal <> 0
         UNION ALL
            Select
                p.SubsectionCode ProductCode,
                td_ss.LocationCode,
                td_ss.TimeCode,
                sum(case 
                        when td_ss.Life = 'C' and td_ss.Seasonality = 'SS' then td_ss.DepotStockRetail
                        else 0
                    end) MeasureVal, 'StkDep_SS_Act' AS MeasureCode
            FROM    Stock td_ss
            inner join
                Product p
            on  td_ss.Kimball = p.CurrentKimball
            and td_ss.SectArea = p.SectArea
            and td_ss.SeasonID = p.SeasonID
            group by
                p.SubsectionCode,
                td_ss.LocationCode,
                td_ss.TimeCode
                    having
            MeasureVal <> 0
         UNION ALL
            Select
                p.SubsectionCode ProductCode,
                td_ss.LocationCode,
                td_ss.TimeCode,
                sum(case td_ss.Life
                        when 'T' then td_ss.DepotStockRetail
                        else 0
                    end) MeasureVal, 'StkDep_Trm_Act' AS MeasureCode
            FROM    Stock td_ss
            inner join
                Product p
            on  td_ss.Kimball = p.CurrentKimball
            and td_ss.SectArea = p.SectArea
            and td_ss.SeasonID = p.SeasonID
            group by
                p.SubsectionCode,
                td_ss.LocationCode,
                td_ss.TimeCode
                    having
            MeasureVal <> 0
         UNION ALL
            Select
                p.SubsectionCode ProductCode,
                td_ss.LocationCode,
                td_ss.TimeCode,
                sum(td_ss.DepotStockRetail) MeasureVal, 'StkDep_Tot_Act' AS MeasureCode
            FROM    Stock td_ss
            inner join
                Product p
            on  td_ss.Kimball = p.CurrentKimball
            and td_ss.SectArea = p.SectArea
            and td_ss.SeasonID = p.SeasonID
            group by
                p.SubsectionCode,
                td_ss.LocationCode,
                td_ss.TimeCode  
                    having
            MeasureVal <> 0
         )x;
    

    【讨论】:

    • 非常感谢大家。如图所示,我发现了另一种方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2016-10-06
    • 1970-01-01
    • 2012-08-05
    • 2022-11-01
    相关资源
    最近更新 更多