2016-10-24 3 views
1

Я очень новичок в Proc sql и чувствую, что я ударился головой о стену. В принципе, я хочу сделать несколько разных промежуточных итогов, и я боролся. Я могу понять, как это сделать в двух sql-операциях, но я не могу понять, как их объединить в один оператор, используя подзапрос, который, похоже, должен быть возможен.Proc sql subtotals и подзапросы

Выборочные данные

*job, gender 
*florist, female 
*florist, female 
*florist, male 
*florist, male 
*Manager, female 
*Manager, female 
*Manager, female 
*Manager, male 
*nurse, female 
*nurse, female 
*nurse, male 

То, что я хочу, чтобы закончить получать из моего кода является:

Job Title| Gender | All answers to gender | Job by gender 
Florist | female | 7      | 2 
Florist | male | 4      | 2 
Manager | female | 7      | 3 
Manager | male | 4      | 1 
nurse | female | 7      | 2 
nurse | male | 4      | 1 

Мой текущий код (который делает это в два этапа) является

proc sql; 
    create table newdata as 
      select gender, job, 
      count(gender) as GenderCount 
      from datasource where gender in ('f','m') 
      group by gender; 

    select * from newdata; 
quit 

proc sql; 
    create table newdata2 as 
      select *, 
      count(gender) as JobsByGender 
      from newdata 
      group by q1, q21; 

     select distinct * from newdata2 order by q21, q1; 
     quit; 
+0

Можете ли вы объяснить, почему вы делаете «select * from newdata» в конце вашего первого заявления proc sql? –

+0

Кроме того, есть ли у вас причина не использовать более одного заявления proc sql? Вы просто хотите, чтобы данные были объединены в одну таблицу? –

+0

да, я хочу это в одном столе, частично потому, что мне придется делать это много раз. У меня, вероятно, есть ненужный мусор, потому что я супер начинающий, и я использую аналогичный пример кода, чтобы выяснить, как я это делаю, и пытаюсь как-то с ним связать, потому что я чувствую, что я не очень понимаю что каждая часть делает. – eee333

ответ

1

Вы можете присоединиться к подзапросу, чтобы получить ожидаемый результат:

proc sql; 
    create table newdata as 
     select bd.job, 
      bd.gender, 
      sq.count_gender, 
      count(bd.job) as JobsByGender 
     from basedata bd 
     inner join 
      (select gender, 
       count(gender) as count_gender 
      from base_data 
      group by gender) sq 
     on sq.gender = bd.gender 
     group by bd.job, bd.gender; 
quit; 

подзапрос создает набор данных, который выглядит как

Gender | count_gender 
--------------------- 
Male | 4 
Female | 7 

Внутреннее соединение совпадает правильное число каждого пола, как указано on sq.gender = bd.gender

Честно говоря, большинство это только общий SQL. Если вы собираетесь делать больше заявлений proc sql в будущем, я настоятельно рекомендую перейти к учебникам, которые можно найти по адресу http://www.sqlcourse.com/ и http://www.sqlcourse2.com/

Это, мы надеемся, позволит вам понять запрос, который вы пишете, а не использовать образец код, который вы не понимаете.

+0

это сообщение об ошибке в итоговой группе: – eee333

+0

ОШИБКА 22-322: Ошибка синтаксиса, ожидающая одно из следующих:!, !!, &, *, **, +, ',', -,/, <, <=, <>, =,>,> =,?, AND, BETWEEN, СОДЕРЖИТ, EQ, EQT, GE, GET, GT, GTT, HAVING, LE, LET, LIKE, LT, LTT, NE, NET, OR, ORDER ,^=, |, ||, ~ =. ОШИБКА 76-322: Синтаксическая ошибка, инструкция будет проигнорирована. – eee333

+0

В окончательном 'GROUP BY' add * sq.count_gender *, который является неагрегированным столбцом во внешнем запросе. – Parfait

Смежные вопросы