Пятые столбцы из UNION имеют другой тип данных в SAS - PullRequest
0 голосов
/ 04 декабря 2018

Я разработчик 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;

Как видите, только ca_no в обеих таблицах после оператора переименования в блоке таблицы B.

Я получаю сообщение об ошибке:

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_m.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.k.g_17_1717a.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..pss_no as ca_no, b.applicant_name, b.program, b.scod_date, b.kick_off_date из newresheet2 b;ВНИМАНИЕ: Таблица расширена пустыми столбцами для выполнения операции установки UNION ALL.ОШИБКА: Столбец 5 от первого участника UNION ALL не совпадает с типом, аналогичным его аналогу из второго.

Я проверил тип данных ca_no в обеих таблицах, и оба они символьные.Когда я считаю пятые столбцы из таблицы A, которая является емкостью, у меня нет столбца с именем Capacity в таблице B. Фактически я закомментировал Capacity_MW из таблицы B, которые не имеют одно и то же имя.Это причина?

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Проблема заключается в том, что в запросе до UNION ALL проецируется большее число столбцов, чем в запросе после оператора UNION ALL.

Необходимо убедиться, что оба запроса выбирают одинаковое количество столбцов.

0 голосов
/ 04 декабря 2018

Самый простой способ решить эту проблему - добавить с помощью оператора set, и он будет добавлен с использованием имени столбца, а не позиции столбца.

   /*create table example of your first dataset. table with more columns*/
   data class1;
  set sashelp.class;
  run;

 /*create table example for your second dataset with fewer column and a different name*/

     data class(keep = name age gender);
    set sashelp.class;
    gender =sex;
     run;



   /* append it using set statement using rename. same name column append together, 
    missing values for other columns where there is no match*/

    data want;
   set class1 class(rename = (gender=sex));
   run;

Вы также можете использовать proc append, он также добавляет, используя имя столбца, а не положение столбца..

0 голосов
/ 04 декабря 2018
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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...