2017-06-21 114 views
0

我試圖從SQL Server下面的代碼轉換爲Teradata的使用UNPIVOT邏輯:轉換的SQL Server UNPIVOT到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的任何幫助都非常感謝。

+0

這將是更容易理解,如果你提供的樣本數據和預期的結果。 –

回答

0

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; 
0
 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; 
+0

非常感謝大家。我發現了另外一種方法,如圖所示。 – Jan