1

我有以下形式的数据:

Country    City1    City2    City3       AverageTemperature
UK         London   Glasgow  Manchester  15
Italy      Rome     Naples   Venice      25
Germany    Munich   Berlin               20
USA        New York                      25

使用 SQL 或 SAS 数据步骤,我想以这种形式获取数据:

Country    City        AverageTemperature
UK         London      15
UK         Glasgow     15
UK         Manchester  15
Italy      Rome        25
Italy      Naples      25
Italy      Venice      25
Germany    Munich      20
Germany    Berlin      20
USA        New York    25

这样我就有了跨行的数据。我曾考虑通过遍历城市不是空白的三个城市列来做到这一点,但我不确定如何自信地做到这一点 - 使用 SQL 或 SAS 是否容易完成?只是一个指针将不胜感激。

4

4 回答 4

2
SELECT COUNTRY, City1,  AverageTemperature FROM Table_Name
UNION ALL 
SELECT COUNTRY, City2,  AverageTemperature FROM Table_Name
UNION ALL 
SELECT COUNTRY, City3,  AverageTemperature FROM Table_Name

要获取 City 列不为空的行,您可以执行以下操作

SELECT COUNTRY, City1,  AverageTemperature FROM Table_Name 
WHERE City1 IS NOT NULL
UNION ALL 
SELECT COUNTRY, City2,  AverageTemperature FROM Table_Name 
WHERE City2 IS NOT NULL
UNION ALL 
SELECT COUNTRY, City3,  AverageTemperature FROM Table_Name 
WHERE City3 IS NOT NULL
于 2013-12-22T01:59:35.950 回答
2

简单的 SAS 数据步骤

data out;
set in;
array cities[3] city1-city3;
format city $12.;
do i=1 to 3;
  if compress(cities[i]) ^= "" then do;
     city = cities[i];
     output;
  end;
end;
keep country city  AverageTemperature;
run;
于 2013-12-22T02:25:41.990 回答
1

您可以使用“相对”标准 SQL 对此进行反透视。这是一种只需要扫描一次数据的方法:

select country, city, averagetemperatur
from (select t.country,
             (case when n = 1 then t.city1
                   when n = 2 then t.city2
                   when n = 3 then t.city3
             end) as city,
            t.averagetemperature
     from t cross join
          (select 1 as n union all select 2 union all select 3) n
    ) t
 where city is not null;

创建具有三行 ( n) 的表的确切语法可能因数据库而异。

于 2013-12-22T02:00:21.003 回答
0

宏循环应该可以完成这项工作:

%MACRO Cities ;
  %DO N=1 %TO 3 ;
    proc sql ;
      create table Cities_&N as
      select Country, City&N as City, AverageTemperature
      from your_table_name_here
      where City&N is not null ;
    quit ;
  %END ;

  data Cities ;
    set Cities_: ;
  run ;
%MEND ;

%Cities ;
于 2014-08-22T14:28:21.120 回答