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

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

Например, я создаю представление, которое возвращает два столбца с именами Give и Ask из таблицы, в которой есть четыре записи для столбца ID(0,1,2,3), Give (100, 90, 75, 60) и Ask как NULL, 110, 99, 100.. Мне удалось создать представление, которое возвращает эти значения в следующем порядке

Give   Ask
100    NULL
90     110
75     99
60     100

Но мне нужно представление, которое возвращает что-то вроде следующего

 Give   Ask
 100    99
 90     100
 75     110
 60     NULL

Как видно из вышеизложенного, столбец Give не связан со столбцом Ask после запуска представления, то есть в исходной таблице SQL записи для значений Give и Ask для ID 0 равны 100 и NULL соответственно, но в представлении значения Give и Ask для первой записи - это 100 и 99, в которых Give находится в порядке убывания, а запрос - в порядке возрастания.

Могу я узнать лучший способ добиться этого.

У меня есть следующий запрос на представление

CREATE VIEW [dbo].[Result]
AS

with CTE as(
SELECT distinct
   CC.Product,
   CC.Term,   
   iCC.Give,
   iCC.Ask


   FROM Cust CC
CROSS APPLY (SELECT TOP 3
                Give,
                Ask, 

             FROM Cust iCC
             WHERE CC.Term = iCC.Term and CC.Product = iCC.Product
             ORDER BY iCC.Give DESC, iCC.Ask ASC) iCC)
             select Product, Term, Give, givelabel as label from CTE 
             union
             select Product, Term, Ask, asklabel from CTE 

GO

person DoIt    schedule 07.04.2014    source источник
comment
Это должно быть работой вашего уровня бизнес-логики.   -  person Crono    schedule 07.04.2014
comment
@Crono Разве это невозможно с представлением, потому что я не хочу изменять таблицу sql   -  person DoIt    schedule 07.04.2014
comment
Вам не нужно изменять таблицу sql. Я говорю о том, что решение вашей проблемы не обязательно должно решаться с точки зрения зрения.   -  person Crono    schedule 07.04.2014
comment
@Crono. Спасибо, но я использовал это представление в большинстве своих приложений, и я просто не хочу заниматься чем-то другим, кроме просмотра, потому что это заставляет меня вносить изменения во многих местах.   -  person DoIt    schedule 07.04.2014


Ответы (1)


Вы можете использовать ROW_NUMBER (), чтобы получить порядок значений конкретной строки в полном столбце в возрастающем или убывающем направлении. В запросе можно выполнить несколько вычислений ROW_NUMBER (). Таким образом, вы можете получить запрос, который показывает, где было бы значение каждого поля, если бы оно было отсортировано независимо. Но на самом деле вы не можете разбить столбцы отдельной таблицы и отсортировать их по-разному. Однако вы можете взять две копии таблицы, независимо отсортировать их, а затем снова СОЕДИНИТЬ их. Уловка в том, как вы снова их ОБЪЕДИНЯЕТЕ. Вы не можете ПРИСОЕДИНЯТЬСЯ к ним по исходному идентификатору, потому что в ваших окончательных результатах «Дать» может исходить от одного идентификатора, а «Спросить» - от другого. По сути, вы должны указать SQL Server выровнять столбцы точно так, как вы их заказали. Вы можете сделать это, указав номер строки в каждой недавно заказанной таблице, а затем присоединившись к этому номеру строки. По сути, это то, что делается в приведенном ниже примере запроса, который возвращает указанные вами результаты.

Единственный трюк заключается в том, что вы хотите, чтобы значения NULL находились внизу (по крайней мере, в столбце ASK), что означает, что значения NULL должны быть самыми большими значениями в столбце, даже если SQL Server, естественно, помещает их как наименьшие значения. . Вы можете использовать isNull для замены NULL максимальным значением для выбранного типа данных (2147483647 - максимальное целое число для примера ниже). NULL в столбце Give, естественно, будут внизу, потому что они считаются «наименьшими» и сортируются в порядке убывания.

DECLARE @GiveAsk TABLE
(
    ID int,
    Give int,
    Ask int
)
INSERT INTO @GiveAsk (ID, Give, Ask) VALUES (0, 100, NULL);
INSERT INTO @GiveAsk (ID, Give, Ask) VALUES (1, 90, 110);
INSERT INTO @GiveAsk (ID, Give, Ask) VALUES (2, 75, 99);
INSERT INTO @GiveAsk (ID, Give, Ask) VALUES (3, 60, 100);

WITH BaseData AS
(
    SELECT
        ROW_NUMBER() OVER (ORDER BY Give DESC) AS GiveOrder,
        ROW_NUMBER() OVER (ORDER BY isNull(Ask,2147483647)) AS AskOrder,
        Give,
        Ask
    FROM        @GiveAsk
)
SELECT      b1.Give,
            b2.Ask
FROM        BaseData b1
JOIN        BaseData b2
ON          b1.GiveOrder = b2.AskOrder
ORDER BY    b1.GiveOrder;

WITH BaseData AS
(
    SELECT
        ROW_NUMBER() OVER (ORDER BY Give DESC) AS GiveOrder,
        ROW_NUMBER() OVER (ORDER BY isNull(Ask,2147483647)) AS AskOrder,
        Give,
        Ask
    FROM        @GiveAsk
)
SELECT      b1.Give,
            b2.Ask
FROM        BaseData b1
JOIN        BaseData b2
ON          b1.GiveOrder = b2.AskOrder
ORDER BY    b1.GiveOrder;
person Riley Major    schedule 07.04.2014