Соедините две таблицы с одинаковым номером строки, но отсортированные по NULL

Мне нужно объединить две таблицы с одинаковым количеством строк. Каждая таблица имеет 1 столбец. НЕТ СОЕДИНИТЕЛЬНОЙ СТОЛБЦЫ, на которую можно ссылаться для соединения. Мне нужно соединить их рядом, потому что каждая таблица была отсортирована отдельно, так что числовые значения находятся вверху в порядке убывания.

Таблица Earners имеет значения дохода, скажем, от 200 000 до 0. Я не могу просто выбрать, используя 2 случая, потому что тогда у меня будет первая строка с доходами выше 100 000, но первые 20 или около того записей во второй строке будут NULL. Я хочу, чтобы вторая строка также была отсортирована по убыванию.

Я искал, используя ORDER BY в CASE, но такого не было. Я пытался прочитать о row_number(), но ни один из примеров не соответствует или не имеет смысла.

drop table #20plus
select
    case
        when Income >= 20000 AND Income < 100000
        then Income end as 'mula'
into #20plus
from Earners
order by mula desc


drop table #100plus
select
    case
        when Income >= 100000
        then Income end as 'dinero'
into #100plus
from Earners
order by dinero desc

Select A.dinero, B.mula
FROM #100plus as A JOIN #20plus as B
ON A.????? = B.?????

Поскольку и A, и B сортируются по убыванию, перемещая все NULL вниз, на что я могу ссылаться, чтобы соединить две таблицы?

Предыдущий вывод с использованием одного оператора SELECT с двумя операторами CASE

dinero             mula
2.12688e+007       NULL
1.80031e+007       NULL
1.92415e+006       NULL
…                  …
NULL               93530.7
NULL               91000
NULL               84500

Желаемый результат с использованием одного оператора SELECT после создания двух временных ТАБЛИЦ

dinero          mula
2.12688e+007    93530.7
1.80031e+007    91000
1.92415e+006    84500
…               82500
NULL            82000
NULL            …
NULL            NULL

Это Microsoft SQL Server 2008. Я новичок в этом, поэтому, пожалуйста, дайте ответ как можно яснее и проще. Спасибо.


person VISQL    schedule 11.04.2012    source источник
comment
Я почти уверен, что вам придется добавить какие-то метаданные, но я точно не знаю, как это сделать. Реляционные базы данных на самом деле не созданы для решения этой проблемы: вы можете добавить второй столбец в каждую таблицу с «порядковым номером», а затем объединить эти столбцы.   -  person Nathaniel Ford    schedule 11.04.2012


Ответы (1)


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

; WITH _20plus AS (
     SELECT CASE WHEN income >= 20000 AND income < 100000 
                 THEN income 
             END AS Mula,
             Row_number() OVER (ORDER BY CASE WHEN income >= 20000 AND income
                < 100000 THEN income END DESC) rn
       FROM earners
     ),
     _100plus AS (
     SELECT CASE WHEN income >= 100000 THEN income 
             END AS Dinero,
            Row_number() OVER (ORDER BY CASE WHEN income >= 100000 
                                             THEN income END DESC) rn
       FROM earners
)
SELECT a.dinero,
       b.mula
FROM _100plus AS a
   INNER JOIN _20plus AS b
      ON a.rn = b.rn  
person Nikola Markovinović    schedule 11.04.2012
comment
Я пока не знаю, как использовать WITH (так же, как SELECT-INTO ?), но я думаю, что вижу, что здесь происходит. Я попробую это с помощью временных таблиц. Спасибо. - person VISQL; 12.04.2012
comment
@VISQL CTE частично соответствует любая производная таблица, но объявляется в более читаемом виде. Вы можете прочитать больше о CTE в ссылке, которую я разместил. Если вы не хотите его использовать, используйте синтаксис производной таблицы вместо временных таблиц. Это стоит проблем. - person Nikola Markovinović; 12.04.2012