Создание отчета по SQL Server 2008. Я объединил одну таблицу с пятью другими, используя LEFT OUTER JOIN
. Когда я выполняю подсчет этих других таблиц, я получаю неверные данные. Я знаю, ПОЧЕМУ, но я не знаю, как это исправить.
Запрос отслеживает поступающих в школу. По мере продвижения по процессу они помечаются на каждом основном этапе процесса. Что мне нужно, так это подсчитать, сколько людей прошли определенный этап в определенный период (год и месяц). В основном это работает. Однако, если кандидат прошел ЛЮБУЮ стадию в периоде, этот кандидат также «учитывается» на предыдущих стадиях, даже если они произошли до запрашиваемого периода. Отличным примером является AD_35, где для конкретной академической программы должен быть один человек, но в выводе указано 2. Когда я запрашиваю ТОЛЬКО таблицу AD_35, я получаю правильную информацию. Итак, я знаю, что проблема связана с внешним соединением, но я не уверен, как решить эту проблему (попробовав различные критерии в подзапросе, который генерирует мои именованные результаты). Кому-то должно быть легко... Заранее спасибо, код ниже. :Year и :Month предназначены для ввода пользователем и будут заполнены числовыми значениями (например, 2015 1)
CW
SELECT DISTINCT
ad_candidacy.prog_cde,
ad_candidacy.stageyr,
ad_candidacy.stagemo,
Count (case when (ad_02.stageyr in (:Year, :Year -1, :Year-2) and ad_02.stagemo <= :month) then 1 else null end) as Inquiry,
Count (case when (ad_05.stageyr in (:Year, :Year -1, :Year-2) and ad_05.stagemo <= :month) then 1 else null end) as Applied,
Count (case when (ad_35.stageyr in (:Year, :Year -1, :Year-2) and ad_35.stagemo <= :month and ad_35.id_num = ad_candidacy.id_num and ad_35.stageyr = ad_candidacy.stageyr and ad_35.stagemo=ad_candidacy.stagemo) then 1 else null end) as Accepted,
Count (case when (ad_50.stageyr in (:Year, :Year -1, :Year-2) and ad_50.stagemo <= :month) then 1 else null end) as Matriculated,
Count (case when (ad_enroll.stageyr in (:Year, :Year -1, :Year-2) and ad_enroll.stagemo <= :month) then 1 else null end) as Enrolled,
ad_candidacy.stagemo_long
FROM
ad_candidacy
LEFT OUTER JOIN
ad_02 ON ad_candidacy.id_num = ad_02.id_num
LEFT OUTER JOIN
ad_05 ON ad_candidacy.id_num = ad_05.id_num
LEFT OUTER JOIN
ad_35 ON ad_candidacy.id_num = ad_35.id_num
LEFT OUTER JOIN
ad_enroll ON ad_candidacy.id_num = ad_enroll.id_num
LEFT OUTER JOIN
ad_50 ON ad_candidacy.id_num = ad_50.id_num
WHERE
(ad_candidacy.stageyr in (:Year, :Year -1, :Year-2) )
AND ( ad_candidacy.stagemo <= :Month )
GROUP BY
ad_candidacy.prog_cde,
ad_candidacy.stageyr,
ad_candidacy.stagemo,
ad_candidacy.stagemo_long
ORDER BY
ad_candidacy.stageyr ASC