2015-07-22 3 views
1

Короче говоря, у меня есть два отдельных запроса, которые я хочу объединить в один лучший. Я ранее делал это с помощью CTE, но мне нужно использовать SSIS '05, и он не поддерживает таблицы CTE или temp, и я не могу за всю жизнь понять, как это сделать без них.SQL Join Without Temp Tables

Как я уже сказал, у меня есть два отдельных выражения 'select'. Один для первых средних, другой для последующих средних значений. Первый имеет вывод, подобный этому:

Description   First_Averages 
a) xxx     4.533333 
b) xxx     8.238095 
c) xxx     .5 
I) xxx     2 
j) xxx     2.25 

и мой второй «выберите» оператор вывода выглядит очень похоже:

Description   Subsequent_Averages 
a) xxx     4.225806 
b) xxx     4.393939 
c) xxx     .1428571 
d) xxx     0 
f) xxx     0 
j) xxx     1.666667 

Использование CTE-х, я получил его, чтобы показать все описание даже если значения были null (заменяя нули на 0) и объединим их в один (гораздо лучше выглядящий) вывод. Желаемый результат, что я был в состоянии получить с КТРОМ выглядит следующим образом:

Description   First_Averages   Subsequent_Averages 
a) xxx     4.533333     4.225806 
b) xxx     8.238095     4.393939 
c) xxx     .5      .1428571 
d) xxx     0       0 
e) xxx     0       0 
f) xxx     0       0 
g) xxx     0       0 
h) xxx     0       0 
i) xxx     2       0 
j) xxx     2.25      1.666667 

Есть ли способ сделать это без использования таблиц CTE-ых лет или временной любого рода?

Мой код для этих первых двух утверждений «выбрать» выглядит следующим образом:

SELECT 
description, avg(total_score) 
FROM (a long select statement) 
WHERE sequence_num = '1' 
group by description 
order by description; 

Второй «выбрать» операторов кода является точно такой же для «SEQUENCE_NUM =„1“», за исключением является «SEQUENCE_NUM <> '1'».

Если вы хотите увидеть код FROM, я могу его обновить и включить. Он делал это сообщение дольше, чем это было, хотя я удалил его.

Я не могу найти способ отображения всех описаний, включая те, которые имеют нулевые средние значения, и присоединить средние к описаниям, как это было в случае с CTE.

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

ответ

4

Try CASE-выражения:

SELECT 
     description, 
     avg(total_score), 
     avg(CASE WHEN sequence_num = 1 THEN total_score END), 
     avg(CASE WHEN sequence_num <> 1 THEN total_score END) 
FROM (a long select statement) 
group by description 
order by description; 
+0

Мне нравится ваш ответ более, чем мой. – Zoldren

+0

Это сработало! По крайней мере по размеру. Он не показывает каждую строку описания, хотя, только те, которые отображаются в первом среднем и втором среднем вместе взятые. Поэтому я получаю a, b, c, d, f, i и j - все еще не e, g и h. Мысли? – rtoken

+0

Если '(длинный оператор select)' не возвращает строки для e, g или h, то вы не получите эти строки на выходе. – Sentinel

0

Если я вас правильно понимаю, вы просто хотите, чтобы соединить два средних со всеми возможными описаниями. Один из способов, которым это может быть достигнуто, что я вижу, глядя на то, что вы предоставили, будет делать то же самое, что вы делаете, чтобы получить средние значения, запросить набор данных, который вы создаете, и сделать соединение.

Например, вы могли бы сделать что-то вроде:

SELECT 
    a.description 
    , IFNULL(b.First_Averages,0) as First_averages 
    , IFNULL(c.Subsequent_Averages,0) as Subsequent_Averages 
FROM (
SELECT 
description--, avg(total_score) 
FROM (a long select statement) 
--WHERE sequence_num = '1' 
group by description 
--order by description; 
) a 
LEFT JOIN (
SELECT 
description, avg(total_score) 
FROM (a long select statement) 
WHERE sequence_num = '1' 
group by description 
--order by description; 
) b 
ON a.description = b.description 
LEFT JOIN (
SELECT 
description, avg(total_score) 
FROM (a long select statement) 
WHERE sequence_num <> '1' 
group by description 
--order by description; 
) c 
ON a.description = c.description 
order by a.description 

Теперь, когда сказал, что, вероятно, не самый хороший способ сделать это. В любое время, когда я должен запрашивать запрошенный набор данных, я всегда стараюсь выяснить, могу ли я упростить то, что делаю.

EDITED исправить полное отсутствие ума, как правильно подключиться. (Добавлены предложения ON)

+0

Ваш концептуально выглядит правильно, но при запуске я получаю ошибку «недостающее ключевое слово». Мне интересно видеть результат, если я могу его запустить. – rtoken

+0

IFNULL может не соответствовать правильному синтаксису, это было некоторое время. Вместо этого попробуйте ISNULL. – Zoldren

+0

Нет, это не проблема, синтаксис для исправления, хотя это «nvl». Должна ли быть «на» в самом низу? – rtoken

0

В соответствии с результатами, которые вы получаете, я думаю, что описание является уникальной колонкой. Итак, почему бы не full outer join таблицы на колонке описания.

select description, coalesce(first_averages,0), coalesce(subsequent_averages,0) from (
select a.*, b.subsequent_averages from 
firsttable a full outer join secondtable b 
on a.description=b.description) 

Это даст вам NULL для тех, которые недоступны.Но функция coalesce будет принимать целое число 0 вместо нуля.

EDITED с объединением.