Объединение наборов результатов, которые используют союзы - PullRequest
0 голосов
/ 21 февраля 2012

У меня есть запросы, которые используют объединения, и я хочу объединить запросы в один набор результатов.Вот пример запроса.Возвращает два набора результатов.Я хочу объединить их в один.Спасибо!

QUERY 1

SELECT COUNT(*) as 'Have you taken an interest/vocational assessment - Pre'
  FROM YESSCAYouth
WHERE Assess2Pre1 = 1
UNION
SELECT COUNT(*)
  FROM YESSCAYouth
 WHERE Assess2Pre1 = 2
UNION
SELECT COUNT(*)
  FROM YESSCAYouth
 WHERE Assess2Pre1 = 3
UNION
SELECT COUNT(*)
  FROM YESSCAYouth
 WHERE Assess2Pre1 = 1 or Assess2Pre1 = 2 or Assess2Pre1 = 3
   AND Assess2PreDate BETWEEN CAST('01/01/2012' AS DATETIME) AND CAST('12/31/2012' AS DATETIME)

QUERY 2

SELECT COUNT(*) as 'Have you taken an interest/vocational assessment - Post'
  FROM YESSCAYouth
 WHERE Assess2Post1 = 1
UNION
SELECT COUNT(*) 
  FROM YESSCAYouth
 WHERE Assess2Post1 = 2
UNION
SELECT COUNT(*)
  FROM YESSCAYouth
 WHERE Assess2Post1 = 3
UNION
SELECT COUNT(*) 
  FROM YESSCAYouth
 WHERE Assess2Post1 = 1 or Assess2Post1 = 2 or Assess2Post1 = 3
   AND Assess2PostDate BETWEEN CAST('01/01/2012' AS DATETIME) AND CAST('12/31/2012' AS DATETIME)

Ответы [ 3 ]

2 голосов
/ 21 февраля 2012

Я думаю Вы хотите что-то вроде этого:

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, с другой стороны, всегда будет правильно конвертировать.

Наконец, в столбцах с именами, содержащими цифры, есть немного запаха дизайна - это говорит о том, что могут существовать другие идентичные столбцы с тем же именем, но с другим номером - когда обычно правильным способом для моделирования будет введите столбец для хранения этого числа и сохраните данные в виде нескольких строк.

0 голосов
/ 24 февраля 2012
SELECT 1 as g, 'Have you taken an interest/vocational assessment - Pre' as x

UNION ALL 

SELECT 2 as g, cast(COUNT (1) as varchar) as x --as 'Have you taken an interest/vocational assessment - Pre'
FROM YESSCAYouth 
WHERE Assess2Pre1 = 1

UNION ALL

SELECT 3 as g, cast(COUNT (1) as varchar) as x FROM YESSCAYouth
WHERE Assess2Pre1 = 2

UNION ALL

SELECT 4 as g, cast(COUNT (1) as varchar) as x FROM YESSCAYouth
WHERE Assess2Pre1 = 3

UNION ALL

SELECT 5 as g, cast(COUNT (1) as varchar) as x FROM YESSCAYouth
WHERE Assess2Pre1 = 1 or Assess2Pre1 = 2 or Assess2Pre1 = 3
AND
Assess2PreDate 
BETWEEN CAST('01/01/2012' AS DATETIME) AND CAST('12/31/2012' AS DATETIME)

UNION ALL
--QUERY 2 ****************************************

SELECT
6 as g, 'Have you taken an interest/vocational assessment - Post'

UNION
ALL 

SELECT
7 as g,cast(COUNT (1) as varchar) as x --as 'Have you taken an interest/vocational assessment - Post'
FROM
YESSCAYouth
WHERE
Assess2Post1 = 1

UNION
ALL

SELECT
8 as g, cast(COUNT (1) as varchar) as x FROM YESSCAYouth
WHERE
Assess2Post1 = 2

UNION
ALL

SELECT
9 as g, cast(COUNT (1) as varchar) as x FROM YESSCAYouth
WHERE
Assess2Post1 = 3

UNION
ALL

SELECT
10 as g, cast(COUNT (1) as varchar) as x FROM YESSCAYouth
WHERE
Assess2Post1 = 1 or Assess2Post1 = 2 or Assess2Post1 = 3
AND
Assess2PreDate 
BETWEEN CAST('01/01/2012' AS DATETIME) AND CAST('12/31/2012' AS DATETIME)
ORDER
BY g
0 голосов
/ 21 февраля 2012

вы бы просто объединили два запроса;Оберните скобки вокруг вашего запроса один и запрос два, а между ними поместите предложение объединения, которое даст вам объединенный набор результатов.

(Запрос 1)

Объединение

(Запрос2)

РЕДАКТИРОВАТЬ: если у вас есть разные имена столбцов, вы можете попробовать поместить его во временную таблицу и объединить его;попробуйте запустить это в SQL Management Studio, это даст вам представление;

select 'tt' as t, 'tete' as tt, 'tets' as ttt
into #test

select 'tt' as tre, 'tete' as tt, 'tets' as ttt
into #testt

select * from #test 
union 
select * from #testt

drop table #test
drop table #testt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...