Многочисленные запросы в другой таблице - PullRequest
0 голосов
/ 06 февраля 2020

У меня вопрос по поводу SAS. У нас есть таблица crimes, состоящая из преступлений (одно преступление в строке с большим количеством информации, такой как статья уголовного закона или дата).

Date        Article
——————————————-
2019-01-01  146
2019-01-01  122
2019-01-01  123
2019-01-01  123
2019-01-02  160
...

Каждый год мы получаем анкету для заполнения сколько преступлений было совершено в определенных категориях (например, мошенничество, убийства и т. д. c.). К сожалению, категории в этой анкете не совпадают с нашими собственными категориями (статьи уголовного закона). Таким образом, мы должны определить, какие статьи попадают в какую категорию опроса. Эта информация хранится в таблице под названием definitions.

. В приведенном ниже примере есть две статьи (110, 111), которые могут быть обобщены как «кража», и три статьи, которые можно обобщить как «нападение» :

Category  Article  Query 
———————————————————————-
Theft     110      select count(*) from crimes where article = 110
Theft     111      select count(*) from crimes where article = 111
Robbery   130      select count(*) from crimes where article = 113
Assault   140      select count(*) from crimes where article = 140
Assault   141      select count(*) from crimes where article = 141
Assault   146      select count(*) from crimes where article = 146     

В нашей базе данных crimes у нас также есть столбец «статья». Цель теперь состоит в том, чтобы прочитать, сколько преступлений.

В результате я хотел бы иметь такую ​​таблицу, которая дает мне количество преступлений на категорию (категории, определенные в таблице definitions):

Category    Count
———————————————————
Theft       10,038
Robbery        503
Assault      1,200

Вопрос теперь в том, как лучше всего получить желаемый результат?

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Я думаю, вы можете использовать это proc sql inner join:

proc sql;
   create table want as
   select d.category,count(*) as count
   from crimes c
   inner join definitions d
   on d.Article = c.Article
   group by 
   d.category;
quit;

Это будет работать, если есть связь между article и category в таблице definitions и есть одна строка для одного преступления с определенной article в таблице crimes.

1 голос
/ 06 февраля 2020

Один из способов сделать это - преобразовать вашу таблицу definitions в пользовательский формат, который может быть прочитан в proc format, а затем суммировать вашу группу, используя пользовательский формат. Это может значительно облегчить работу с кодом в дальнейшем. Чтобы создать собственный и динамический формат c, вам понадобятся только следующие переменные: start, end, label, category и fmtname.

Если вы забудете, что каждый Переменная представляет, проверьте эту бумагу , или просто создайте фиктивный формат и прочитайте выходную таблицу, используя опцию cntlout=.

data fmt;
    length fmtname $32.
           label   $25.
    ;

    set definitions end=eof;

    fmtname = 'articlecat'; /* Format name */
    type    = 'C';          /* Format type. C = Character */
    start   = article;      /* Start lookup value */
    end     = article;      /* End lookup value */
    label   = category;     /* Custom format name to apply to start/end */
    output;

    /* Optional: Give a label for unknown articles using the special HLO variable */
    if(eof) then do;
        HLO = 'O'; /* Special variable representing 'other' */
        call missing(start, end);
        label = 'Unknown';
        output;
    end;

    keep start end fmtname type label hlo;
run;

/* Save the format */
proc format cntlin=fmt;
run;

Теперь вы можете использовать свой формат где угодно в программа без каких-либо присоединений к файлу определения.

proc sql noprint;
    create table want as
        select put(category, $articlecat.) as Category
            , count(*) as Count
        from crimes
        group by calculated Category
    ;
quit;
...