Условная сумма в SQL (SAS) (эквивалент SUMIFS) — Часть 2

#sql #sas #sumifs

#sql #sas #sumifs

Вопрос:

Допустим, у меня есть таблица:

Таблица 1:

 ID  Item
1   A
1   B
1   A
2   B
2   B
3   A
3   B
3   B
3   A
  

Таблица 2:

 ID  A   B   C
1   91  94  90
2   100 97  93
1   97  94  96
2   97  95  90
3   99  100 93
1   90  97  97
  

Теперь я хотел бы взять условную сумму для моей таблицы1 из таблицы2 (когда идентификатор по строке и элемент совпадают по СТОЛБЦУ):

 ID  Item    Want
1   A       278
1   B       285
2   A       197
2   B   
2   B   
3   A   
3   B   
3   B   
3   A   
  

Таким образом, у меня есть 278 — это сумма всех элементов 1 в столбце A, 285 — это сумма всех элементов 1 в столбце B, 197 — это сумма всех элементов 2 в столбце A.

Итак, что я должен делать в SQL?

Заранее спасибо.

Комментарии:

1. Почему заполнены только первые три строки?

2. Я просто привожу пример.

3. . . Ваш «пример» вводит в заблуждение. Хотя я предполагал, что, вероятно, лучше показать только первые три строки и указать, что остальные следуют тому же шаблону (скажем . . . ). Пустые значения отличаются от вычисленных значений.

4. Вы все еще не полностью описали, что означает «условная сумма». Эта терминология мне незнакома, и я предполагаю, что она также неизвестна большинству людей. Я предполагаю, что это суммирование на основе выполнения некоторого условия. Какое условие вы хотите протестировать?

5. Привет, извините за мою вводящую в заблуждение терминологию. На самом деле я хочу сказать, что условная сумма, то есть сумма, основанная на 2 условиях: совпадении в строке (id) и совпадении в столбце (item).

Ответ №1:

Вы можете использовать join и условную агрегацию:

 select t1.id, t1.item,
       sum(case when t1.item = 'A' then t2.A
                when t1.item = 'B' then t2.B
                when t1.item = 'C' then t2.C
           end) as want
from table1 t1 left join
     table2 t2
     on t1.id = t2.id
group by t1.id, t1.item
  

Комментарии:

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

2. @tmtran99 . . . (1) Таблицы SQL, в отличие от наборов данных SAS, представляют неупорядоченные наборы. У них нет упорядочения. (2) Вы также можете использовать коррелированный подзапрос.

Ответ №2:

Proc MEANS создается с нуля с единственной целью вычисления статистики для агрегатов.

Рассмотрим этот пример:

 data have; input
ID $ A   B   C; datalines;
1   91  94  90
2   100 97  93
1   97  94  96
2   97  95  90
3   99  100 93
1   90  97  97
;

ods _all_ close;

proc means  data=have stackodsoutput sum;
  class id;
  var a b c;
  ods output summary=want;
run;              
  

это создает набор данных

введите описание изображения здесь