Функция SAS CATS, возвращающая периоды вместо чисел - PullRequest
0 голосов
/ 14 июня 2019

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

Эти две функции возвращают результаты правильно, если их использовать отдельно от функции cat.

Пример: 2/14/2019

MONTH (APP.SUBMITTEDON) возвращает 2

ГОД (APP.SUBMITTEDON) возвращает 2019

Но когда я пытаюсь объединить их вместе, как показано ниже, он возвращает ./.а не 2 / 2019.

CATS (MONTH (APP.SUBMITTEDON), '/', YEAR (APP.SUBMITTEDON)) AS MONTH_YEAR

Мысли?

Полный кодэто:

proc sql;
create table COUNTS AS
select distinct COUNT.APP_ID AS COUNT
,CATS(MONTH(APP.SUBMITTEDON),'/',YEAR(APP.SUBMITTEDON)) AS MONTH_YEAR
from APP
GROUP BY MONTH_YEAR;

Ответы [ 4 ]

0 голосов
/ 16 июня 2019

Функция CATS () будет использовать символ, назначенный параметру MISSING, для пропуска числовых значений. Вместо этого вы можете изменить отсутствующий параметр на пробел, и тогда периоды не будут отображаться.

Но из комментариев к некоторым другим ответам кажется, что ваша настоящая проблема в том, что вы имеете дело с переменной DATETIME, а не с переменной DATE. SAS сохраняет значения DATE как количество дней с 1960 года, а значения DATETIME - количество секунд. Такие функции, как MONTH () и YEAR () не будут работать правильно, если задано число в секундах вместо дней.

Также нет необходимости извлекать месяц и год и вставлять их вместе, поскольку в SAS уже есть форматы, которые будут возвращать эту строку для вас. Например, вы можете использовать формат MONYY (или DTMONYY для значений даты и времени).

create table COUNTS AS
select put(submittedon,dtmonyy.) as month_year
     , count( distinct APP_ID) AS COUNT
from APP
GROUP BY MONTH_YEAR
;

Обратите внимание, что вы можете использовать формат, который помещает ГОД перед МЕСЯЦЕМ, чтобы значения вашей новой символьной переменной сортировались правильно.

create table COUNTS AS
select substr(put(datepart(submittedon),yymmdds10.),1,7) as month_year
     , count( distinct APP_ID) AS COUNT
from APP
GROUP BY MONTH_YEAR
;
0 голосов
/ 14 июня 2019

Вы можете использовать тот факт, что это дата SAS, и использовать ее.

proc sql;
create table COUNTS AS
select distinct COUNT.APP_ID AS COUNT
, put(datepart(app.submittedon), yymms10.) AS MONTH_YEAR
from APPLICANT
GROUP BY MONTH_YEAR;
quit;

РЕДАКТИРОВАТЬ: Изменено для работы с переменной времени данных.

0 голосов
/ 14 июня 2019

Эта комбинация функций верна.У вас есть что-то еще, что не указано в вашем вопросе:

Создайте несколько примеров данных:

data have;
  do date='31jan2019'd to '1feb2019'd;
    output;
  end;
run;

Проверьте выполнение базового запроса к нему, используя cats(), month()и year():

proc sql ;
  create table counts as
  select date,
         month(date) as month,
         year(date) as year,
         cats(month(date),'/',year(date)) as month_year1,
         put(date,yymms7.) as month_year2
         put(date,yymmn6.) as month_year3
  from have
  ;
quit;

Я также добавил несколько альтернативных способов представления переменных даты в виде месяца / года с использованием различных форматов.

Наконец, это действительно плохая идеяиспользуйте оба предложения distinct и предложение group by в одном и том же запросе SQL.Дважды проверьте, что вы намереваетесь сделать здесь, поскольку в данном случае запрос может не дать ожидаемых результатов, и его намерение будет трудно установить.

0 голосов
/ 14 июня 2019

Функции месяца и года возвращают INT

вам нужен символ

put(month(APP.SUBMITTEDON),z2.) 

или используйте формат monyy.изменить отображение даты на месяц год.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...