首页 > 解决方案 > UNION 的第五列在 SAS 中具有不同的数据类型

问题描述

我是一名 SAS 开发人员。我正在使用 PROC SQL 来执行联合语句。我的代码:

proc sql;
create table test3 as
select a.state 
,a.station 
,a.ca_no
,a.applicant_name
,a.capacity
,a.commission_date
,a.technology
,a.pmu
,a.ppu
,a.ssu_pe
,a.re_switch_no
,a.voltage
,a.vcb_brand_and_model
,a.scada_y_n
,a.gps_coordinate
,a.plant_manager_phone_number
,a.plant_manager_name
,a.plant_manager_email
,a.highest_md_recorded_a
,a.highest_md_recorded_kw
,a.total_energy_sold
%do c=1 %to 12;
,a.kwh_&&ALLDATES&c..
%end;
%do c=1 %to 12;
,a.gen_factor_&&ALLDATES&c..
%end;
,a.period
from test a
union all
select b.pss_no as ca_no
,b.applicant_name /*capacity_mw voltage technology*/
,b.program
,b.scod_date 
,b.kick_off_date
from newresheet2 b;
quit;

如您所见,表 B 块中的重命名语句之后的两个表中只有 ca_no。

我收到错误消息:

MPRINT(TRASPOSETRX):proc sql;MPRINT(TRASPOSETRX): 创建表 test3 作为选择 a.state ,a.station ,a.ca_no ,a.applicant_name ,a.capacity ,a.commission_date ,a.technology ,a.pmu ,a.ppu ,a.ssu_pe , a.re_switch_no ,a.voltage ,a.vcb_brand_and_model ,a.scada_y_n ,a.gps_coordinate ,a.plant_manager_phone_number ,a.plant_manager_name ,a.plant_manager_email ,a.highest_md_recorded_a ,a.highest_md_recorded_kw ,a.total_energy_sold ,a.kwh_SEPT17 kwh_oct17,a.kwh_nov17,a.kwh_dec17,a.kwh_jan18,a.kwh_feb18,a.kwh_mar18,a.kwh_apr18,a.kwh_may18,a.kwh_jun18,a.kwh_jun18,a.kwh_july18,a.kwoly18,a.kwh_gh_gh_gen_gen_gen_gen_gen_gen_centoct17 a.gen_factor_NOV17 ,a.gen_factor_DEC17 ,a.gen_factor_JAN18 ,a.gen_factor_FEB18 ,a.gen_factor_MAR18 ,a.gen_factor_APR18 ,a.gen_factor_MAY18 ,a.gen_factor_JUN18 ,a.gen_factor_JULY18 ,a.gen_factor_AUG18 ,a. 从测试工会开始的​​期间,所有从 newresheet2 b 中选择 b.pss_no 作为 ca_no 、b.applicant_name 、b.program 、b.scod_date 、b.kick_off_date;警告:已使用空列扩展表以执行 UNION ALL 集操作。错误:UNION ALL 的第一个贡献者的第 5 列与第二个贡献者的类型不同。

我检查了两个表中 ca_no 的数据类型,两者都是字符。当我计算表 A 中的第五列(即容量)时,我在表 B 中没有名为 Capacity 的列。事实上,我从表 B 中注释掉了不同名称的 Capacity_MW。这是原因吗?

标签: sqlsas

解决方案


CREATE TABLE test3 AS

SELECT
   a.STATE
 , a.station
 , a.ca_no
 , a.applicant_name
 , a.capacity
      --------- more than 5 -----------
 , a.commission_date
 , a.technology
 , a.pmu
 , a.ppu
 , a.ssu_pe
 , a.re_switch_no
 , a.voltage
 , a.vcb_brand_and_model
 , a.scada_y_n
 , a.gps_coordinate
 , a.plant_manager_phone_number
 , a.plant_manager_name
 , a.plant_manager_email
 , a.highest_md_recorded_a
 , a.highest_md_recorded_kw
 , a.total_energy_sold
 , a.kwh_SEPT17
 , a.kwh_OCT17
 , a.kwh_NOV17
 , a.kwh_DEC17
 , a.kwh_JAN18
 , a.kwh_FEB18
 , a.kwh_MAR18
 , a.kwh_APR18
 , a.kwh_MAY18
 , a.kwh_JUN18
 , a.kwh_JULY18
 , a.kwh_AUG18
 , a.gen_factor_SEPT17
 , a.gen_factor_OCT17
 , a.gen_factor_NOV17
 , a.gen_factor_DEC17
 , a.gen_factor_JAN18
 , a.gen_factor_FEB18
 , a.gen_factor_MAR18
 , a.gen_factor_APR18
 , a.gen_factor_MAY18
 , a.gen_factor_JUN18
 , a.gen_factor_JULY18
 , a.gen_factor_AUG18
 , a.period
FROM test a

该部分有超过 5 列:以下部分确实有 5 列:

UNION ALL

SELECT
   b.pss_no AS ca_no
 , b.applicant_name
 , b.program
 , b.scod_date
 , b.kick_off_date
FROM newresheet2 b;

联合要求每个子查询中的列数相同,并且这些列中的每一个都必须是“兼容的”数据类型(例如,整数将进入十进制列,但 varchar 不会进入日期列)。

这些柱对是否兼容?

SELECT
   a.STATE
 , a.station
 , a.ca_no
 , a.applicant_name
 , a.capacity
FROM test a

UNION ALL

SELECT
   b.pss_no         AS ca_no
 , b.applicant_name
 , b.program
 , b.scod_date
 , b.kick_off_date
FROM newresheet2 b;

列的“对齐”不是通过列名/别名来实现的,而是通过 select 子句中的位置来实现的,a.ca_no 下方与 b.pss_no 对齐,a.applicant_name 与 b.applicant_name 对齐

SELECT
   a.ca_no
 , a.applicant_name
FROM test a

UNION ALL

SELECT
   b.pss_no         AS ca_no
 , b.applicant_name
FROM newresheet2 b;

推荐阅读