#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;
это создает набор данных