#sql #sas
#sql #sas
Вопрос:
Я создаю таблицу результатов, и мне нужно выполнить два подзапроса, чтобы вычислить некоторые ключевые показатели эффективности. При выполнении кода без группировки по в подзапросах это работает. Однако ключевые показатели эффективности неверны, потому что мне нужно, чтобы они были сгруппированы по ‘TRAMO_CAP_FINAL’ — если нет, я получаю одинаковые цифры для разных групп. Затем я включаю GROUP BY в подзапросы, но это не работает, и я получаю вышеупомянутую ошибку (ОШИБКА SAS: подзапрос оценивается более чем в одну строку).
Ваша помощь была бы очень признательна.
PROC SQL;
CREATE TABLE WORK.OUTPUT_MC_SEGMENT AS
SELECT "MIDCORP" AS SEGMENT,
t1.TRAMO_CAP_FINAL,
(SUM(t1.GWP)/SUM(t1.CAP_FINAL))*1000 AS AVG_BOOK_RATE,
(SELECT (SUM(t1.GWP)/SUM(t1.CAP_FINAL))*1000 AS AVG_RATE_lowmid
FROM TABLA_FINAL_MC t1
WHERE t1.HG IN (1,2,3,4,5) AND t1.INFORCE_P=1
GROUP BY t1.TRAMO_CAP_FINAL),
(SELECT (SUM(t1.GWP)/SUM(t1.CAP_FINAL))*1000 AS AVG_RATE_high
FROM TABLA_FINAL_MC t1
WHERE t1.HG IN (6,7,8,9) AND t1.INFORCE_P=1
GROUP BY t1.TRAMO_CAP_FINAL)
FROM TABLA_FINAL_MC t1
WHERE t1.INFORCE_P=1
GROUP BY t1.TRAMO_CAP_FINAL;
QUIT;
Ответ №1:
Используйте условную агрегацию следующим образом:
SELECT "MIDCORP" AS SEGMENT,
t1.TRAMO_CAP_FINAL,
(SUM(t1.GWP)/SUM(t1.CAP_FINAL))*1000 AS AVG_BOOK_RATE,
(SUM(case when t1.HG IN (1,2,3,4,5) AND t1.INFORCE_P=1 then t1.GWP end)/SUM(case when t1.HG IN (1,2,3,4,5) then t1.CAP_FINAL end))*1000 AS AVG_RATE_lowmid,
(SUM(case when t1.HG IN (6,7,8,9) AND t1.INFORCE_P=1 then t1.GWP end)/SUM(case when t1.HG IN (6,7,8,9) then then t1.CAP_FINAL end))*1000 AS AVG_RATE_high
FROM TABLA_FINAL_MC t1
WHERE t1.INFORCE_P=1
GROUP BY t1.TRAMO_CAP_FINAL;
Комментарии:
1. Это работает, Popeye. Большое спасибо за вашу любезную помощь!
2. Вы можете принять ответ, если он решил вашу проблему.