Здесь мне нужно избегать этих 2 столбцов из предложения group by, где оно возвращает большее количество записей по сравнению с моим ожидаемым значением.
Фактически результат запроса от st.cnt
возвращает 3 записи, но когда мы запускаем как SP
, я получаю двойной, как ожидалось.
st_cnt.COUNT_FILES,
st_cnt.COUNT_SCANS,
SELECT table1.DA_SEC,
table1.DA_REG,
table1.PROJ,
table1.SOL,
table1.SCAN_YEAR_MON,
to_char(TO_DATE(table1.SCAN_YEAR_MON, 'YYYY-MM'), 'YYYY'),
to_char(TO_DATE(table1.SCAN_YEAR_MON, 'YYYY-MM'), 'MM'),
COUNT(DISTINCT table1.ISSUE_ID),
COUNT(DISTINCT table1.USERNAME),
COUNT(DISTINCT table1.PATH),
st_cnt.COUNT_FILES,
st_cnt.COUNT_SCANS,
sum(unq_Pro.HIGH_CNT),
sum(unq_Pro.MEDIUM_CNT),
sum(unq_Pro.LOW_CNT),
sum(SUPPR_HIGH) - sum(UNSUPPR_HIGH),
sum(SUPPR_MEDIUM) - sum(UNSUPPR_MEDIUM),
sum(SUPPR_LOW) - sum(UNSUPPR_LOW),
CURRENT_DATE
FROM table1
JOIN
(SELECT PROJ, SOL, SCAN_YEAR, SCAN_MONTH, COUNT(DISTINCT PATH) COUNT_FILES, COUNT(DISTINCT SCAN_ID) COUNT_SCANS FROM table2 GROUP BY PROJ, SOL, SCAN_YEAR, SCAN_MONTH) st_cnt
ON st_cnt.PROJ = table1.PROJ--AND st_cnt.SOL = table1.SOL
GROUP BY table1.DA_SEC, table1.DA_REG, table1.PROJ, table1.SOL, table1.SCAN_YEAR_MON, st_cnt.COUNT_FILES, st_cnt.COUNT_SCAN;
Много времени, используя параметр "С", может быть действительно полезным в таких сценариях. Вот тема, в которой обсуждается предложение с предложением Ask Tom Link также полезная ссылка на факторинг подзапроса с использованием предложения здесь Sub Query Factoring
Это также помогает нам узнать, как выглядят данные для таблицы 1 в этом случае, чтобы мы могли проверить ответ. Но с информацией, которую вы поделили, что-то вроде этого может помочь вам
WITH TAB1_DATA AS (
SELECT table1.DA_SEC,
table1.DA_REG,
table1.PROJ,
table1.SOL,
table1.SCAN_YEAR_MON,
to_char(TO_DATE(table1.SCAN_YEAR_MON, 'YYYY-MM'), 'YYYY'),
to_char(TO_DATE(table1.SCAN_YEAR_MON, 'YYYY-MM'), 'MM'),
COUNT(DISTINCT table1.ISSUE_ID),
COUNT(DISTINCT table1.USERNAME),
COUNT(DISTINCT table1.PATH),
sum(unq_Pro.HIGH_CNT),
sum(unq_Pro.MEDIUM_CNT),
sum(unq_Pro.LOW_CNT),
sum(SUPPR_HIGH) - sum(UNSUPPR_HIGH),
sum(SUPPR_MEDIUM) - sum(UNSUPPR_MEDIUM),
sum(SUPPR_LOW) - sum(UNSUPPR_LOW),
CURRENT_DATE
FROM table1
GROUP BY table1.DA_SEC, table1.DA_REG, table1.PROJ, table1.SOL, table1.SCAN_YEAR_MON
)
SELECT TD.* , st_cnt.COUNT_FILES,st_cnt.COUNT_SCANS FROM TAB1_DATA TD ,
(SELECT PROJ, SOL, SCAN_YEAR, SCAN_MONTH, COUNT(DISTINCT PATH) COUNT_FILES,
COUNT(DISTINCT SCAN_ID) COUNT_SCANS FROM table2 GROUP BY PROJ, SOL, SCAN_YEAR,
SCAN_MONTH) st_cnt
WHERE st_cnt.PROJ = TD.PROJ;