【问题标题】:Split a column by values into new columns SQL按值将列拆分为新列 SQL
【发布时间】:2026-02-12 03:20:09
【问题描述】:

我正在尝试学习 SAS,我想将表的不同行拆分为不同的列,以对数据进行分组。

即,

表格详解

Num    Date   Type Amount    
A1  6/12/2018 Merc   5    
A2  7/3/2014  Merc   10    
A2  6/5/2014  Merc   6    
A2  6/5/2014  Cong   15
A3  5/6/2020  Cong   30   
A4  7/8/2019  Cong   6     
A3  5/6/2020  Fres   7
A4  7/8/2019  Fres   9

我想在这个表中变换

表格摘要

Num    Date   Merc Cong Fres    
A1  6/12/2018  5   
A2  7/3/2014   10    
A2  6/5/2014   6    15   
A3  5/6/2020        30   7  
A4  7/8/2019        6    9     

已开发此查询但无法正常工作。

PROC SQL;
   CREATE TABLE WORK.Summary AS 
   SELECT t1.Number, 
          t1.Date, 
          t1.Type, 
          (case when t1.Type='Mercearia' then t1.Type) as Merc,
          (case when t1.Type='Congelado' then t1.Type) as Cong,
          (case when t1.Type='Fresco' then t1.Type) as Fres,
      FROM WORK.Detailed t1
END    

提前致谢!

【问题讨论】:

  • SQL 可以工作,但 PROC TRANSPOSE 是更好的解决方案,因为它是动态的,您不需要提前知道不同的类型或考虑它们。当您的类型超过 3 个时,这会变得非常麻烦。

标签: sql sas proc-sql enterprise-guide


【解决方案1】:

改用 PROC TRANSPOSE。它是动态的,因此您无需提前知道类型的数量。

proc sort data=detailed; by number date;

proc transpose data=detailed out=Summary;
by number date;
id type;
var amount;
run;

【讨论】:

    【解决方案2】:

    你很接近。您需要聚合并修复一些其他语法:

    SELECT d.Number, d.Date, 
           MAX(case when d.Type = 'Mercearia' then d.Amount end) as Merc,
           MAX(case when d.Type = 'Congelado' then d.Amount end) as Cong,
           MAX(case when d.Type = 'Fresco' then d.Amount end) as Fres
    FROM WORK.Detailed d
    GROUP BY d.Number, d.Date;
    

    【讨论】: