Я думаю Вы хотите что-то вроде этого:
select
COALESCE(a1.Level,a2.Level) as Level,
COALESCE(a1.Cnt,0) as 'Have you taken an interest/vocational assessment - Pre',
COALESCE(a2.Cnt,0) as 'Have you taken an interest/vocational assessment - Post'
from
(select Assess2Pre1,COUNT(*) from YESSCAYouth where Assess2Pre1 in (1,2,3) group by Assess2Pre1)
a1(Level,Cnt)
full outer join
(select Assess2Post1,COUNT(*) from YESSCAYouth where Assess2Post1 in (1,2,3) group by Assess2Post1)
a2(Level,Cnt)
on
a1.Level = a2.Level
union all
select
4,
SUM(CASE WHEN Assess2Pre1 in (1,2,3) and Assess2PreDate between '20120101' and '20121231' THEN 1 END),
SUM(CASE WHEN Assess2Post1 in (1,2,3) and Assess2PostDate between '20120101' and '20121231' THEN 1 END)
from YESSCAYouth
Выше я сопоставил второй и третий столбцы, чтобы они представляли сопоставимые результаты двух разных состояний. Затем я ввел объединение, чтобы получить запрос на основе даты.
Если это не , что вы ищете, пожалуйста, добавьте некоторые примерные данные и ожидаемые результаты к вашему вопросу. (Я хотел бы отметить, что мой запрос выше будет отличаться от вашего, если до и после счета будут равны 0 для одного из "уровней").
Другие примечания: in()
- реальная экономия пространства, полностью эквивалентная column = value1 or column = value2...
. И mm/dd/yyyy
не является безопасным форматом, который можно использовать для преобразования в даты без использования CONVERT()
и указания явного формата. yyyymmdd
, с другой стороны, всегда будет правильно конвертировать.
Наконец, в столбцах с именами, содержащими цифры, есть немного запаха дизайна - это говорит о том, что могут существовать другие идентичные столбцы с тем же именем, но с другим номером - когда обычно правильным способом для моделирования будет введите столбец для хранения этого числа и сохраните данные в виде нескольких строк.