Результаты упорядочения с нестандартным упорядочением (по возрастанию, но с нулями в конце) и добавление номера строки для каждой строки. - PullRequest
0 голосов
/ 25 января 2012
SET NOCOUNT ON 

DECLARE @Products TABLE (product_id VarChar(50),product_name VarChar(50) )

INSERT INTO @Products Values ('1','Pen');
INSERT INTO @Products Values ('2','Pencil');
INSERT INTO @Products Values ('3','School Bag');
INSERT INTO @Products Values ('4','Book');
INSERT INTO @Products Values ('5','Pencil Box');

SET NOCOUNT ON 

DECLARE @Rates TABLE (product_id VarChar(50),price int )

INSERT INTO @Rates Values ('1','10');
INSERT INTO @Rates Values ('3','5');
INSERT INTO @Rates Values ('1','5');
INSERT INTO @Rates Values ('4','20');
INSERT INTO @Rates Values ('4','15');
INSERT INTO @Rates Values ('5','30');

SELECT count(*) over() Total_Record,
    p.product_id, p.product_name,  ISNULL(MIN(r.price), 0) AS MinPrice 
FROM 
    @Products p 
LEFT OUTER JOIN
    @Rates r 
ON
    r.product_id = p.product_id 
GROUP BY 
    p.product_id, p.product_name
ORDER BY
    p.product_name

Мне нужна дополнительная фильтрация ....

  1. Нужно MinPrice as ASC, а MinPrice'0 'стоит последним в списке вывода (например, 1, 5,6,10,8,0,0,0...)

  2. ROW_NUMBER() OVER (---) согласно последнему выводу ...

1 Ответ

1 голос
/ 25 января 2012

Для # 1, чтобы создать порядок сортировки, подобный этому (1, 5, 6, 8, 10, 0, 0, 0), вы можете создать еще один столбец, по которому можно отсортировать, и вставить специальное условие сортировки, которое вы хотите с определением этого столбца.

Например (см. SortOrder ниже):

SELECT count(*) over() Total_Record,
    p.product_id, p.product_name,  
    ISNULL(MIN(r.price), 0) AS MinPrice,
    case when ISNULL(MIN(r.price), 0) > 0 then 1 else 0 end as sortOrder
FROM @Products p  
LEFT OUTER JOIN @Rates r  ON
    r.product_id = p.product_id  
GROUP BY 
    p.product_id, p.product_name 
ORDER BY
    sortOrder desc, MinPrice asc

Если я правильно понял ваш вопрос.

Я переключил ваши 8 и 10, а также я предполагаю, что вы пытаетесь отсортировать по вычисленному полю минимальной цены по возрастанию, но с нулями в конце, а не в начале. Все ненулевые значения получают sortOrder = 1, а нулевые значения - sortOrder = 0. Это отделяет нулевые и ненулевые значения, поэтому вы можете сортировать их по своему усмотрению

Что касается # 2 - для этого вы хотите дополнительный столбец в вашем выборе, который включает в себя номер строки упорядоченных значений.

Единственный простой способ сделать это - через row_number ().

SELECT count(*) over() Total_Record,
    p.product_id, p.product_name,  
    ISNULL(MIN(r.price), 0) AS MinPrice,
    case when ISNULL(MIN(r.price), 0) > 0 then 1 else 0 end as sortOrder,
    row_number() OVER(order by sortOrder desc, MinPrice asc) as rowNumber
FROM @Products p  
LEFT OUTER JOIN @Rates r  ON
    r.product_id = p.product_id  
GROUP BY 
    p.product_id, p.product_name 
ORDER BY
    sortOrder desc, MinPrice asc

Это создает row_number () на основе предложения output_by.

(Обратите внимание, что сейчас у меня нет экземпляра SQL Server для двойной проверки синтаксиса. Кроме того, я действительно хотел бы проверить, чтобы MSSQL не препятствовал объединению групп с помощью row_number (). В документах ничего не сказано, и я не очень часто использую эту функцию. Но вот она.)

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