2015-06-16 5 views
0

У меня вопрос SQL о том, как упорядочивается мой вывод запроса.Упорядочить по двум столбцам SQL

Вот как вывод выглядит сейчас:

REFERRED_FROM  REFERRED_FROM_COUNT  REFERRED_TO  REFERRED_TO_COUNT 
sample   sample number 
sample   sample number 
sample   sample number 
              sample   sample number 
              sample   sample number 
              sample   sample number 

А вот мой желаемый результат:

REFERRED_FROM  REFERRED_FROM_COUNT  REFERRED_TO  REFERRED_TO_COUNT 
sample   sample number   sample   sample number 
sample   sample number   sample   sample_number 
sample   sample number   sample   sample number 

Я довольно новыми для SQL сценариев, но я абсолютно уверен, что это выполнимо и я не уверен, почему я не могу понять это.

В настоящее время у меня есть 4 оператора case в моем операторе select, заканчивающийся как Referred_From, Referred_From_Count и т. Д. ... и я заказываю по номерам Referred_From и id. Мои выходные данные верны, однако форматирование выключено. Является ли это легким решением или мне придется переделать базу, как я это делаю?

Заранее спасибо, я с нетерпением жду этого.

+1

Вы не сможете сделать это только с заказом. Вам нужно будет изменить оператор select –

+0

Это не просто проблема с заказом. Вы показываете, что ваш запрос возвращает * six * rows; который не может быть преобразован в * три * строки с предложением 'ORDER BY'. (Вы не можете понять, как это сделать, потому что это невозможно.) Вам нужно будет внести более существенные изменения в ваш запрос или обработать «переформатирование» результата в клиенте. – spencer7593

ответ

1

Спасибо за помощь! Я смог сделать это наиболее эффективно с помощью CTE. Я также использовал путь Лукаса Эдера как практику, так что спасибо за сообщение об этом.

Короче говоря, я сделал это:

WITH ref_from as ........ 

WITH ref_to as .......... 

SELECT Referred_From, Referred_From_Count, Referred_To, Referred_To_Count 
FROM (select rownum rowfrom, ref_from.* from ref_from) t1, 
    (select rownum rowto, ref_to.* from ref_to) t2 
WHERE rowfrom = rowto; 

Я создал «rowfrom» и «rowto», так что я что-то, чтобы присоединиться к двум вместе и она работала отлично.

Еще раз спасибо, я очень ценю советы.

0

Вам необходимо иметь их как 2 отдельных набора результатов и добавить row_number() over (order by ...) для обоих из них, чтобы оба результата имели число 1,2 ... для разыскиваемого заказа.

Затем присоедините к результирующим наборам номер строки и используйте полное внешнее соединение в случае, если любой из них может содержать больше строк.

+0

И так вы делаете это в SQL Server, другие платформы баз данных могут иметь некоторые отличия, по крайней мере, в синтаксисе –

1

Вот возможное решение:

SELECT referred_from, referred_from_count, referred_to, referred_to_count 
FROM (
    SELECT referred_from, referred_from_count, rownum r 
    FROM my_table 
    WHERE referred_from IS NOT NULL 
    AND referred_from_count IS NOT NULL 
) t1 
FULL OUTER JOIN (
    SELECT referred_to, referred_to_count, rownum r 
    FROM my_table 
    WHERE referred_to IS NOT NULL 
    AND referred_to_count IS NOT NULL 
) t2 
ON t1.r = t2.r 

В качестве альтернативы можно использовать функцию ROW_NUMBER() окна, как предложенный JamesZ, но я подозреваю, что будет немного медленнее:

SELECT referred_from, referred_from_count, referred_to, referred_to_count 
FROM (
    SELECT referred_from, referred_from_count, ROW_NUMBER() OVER (ORDER BY id) r 
    FROM my_table 
    WHERE referred_from IS NOT NULL 
    AND referred_from_count IS NOT NULL 
) t1 
FULL OUTER JOIN (
    SELECT referred_to, referred_to_count, ROW_NUMBER() OVER (ORDER BY id) r 
    FROM my_table 
    WHERE referred_to IS NOT NULL 
    AND referred_to_count IS NOT NULL 
) t2 
ON t1.r = t2.r 
0

Я думаю, было бы лучше предоставить запрос. Похоже, вы пытаетесь сделать что-то вроде:

select Id, Referred_from ,COUNT(Referred_from),Referred_to,COUNT(Referred_to) 
group by id, referred_from,referred_to 
order by Id,referred_from 
Смежные вопросы