2014-10-28 2 views
0

У меня есть таблица с номерами клиентов, номерами заказов & ранг полей. Каждый номер клиента может иметь несколько заказов с разными значениями ранга. Ex.Выбор строк со вторым минимальным рангом в SQL Server

cust# order# rank 

1  12  1 
1  13  3 
1  14  2 
2  15  2 
2  16  1 
3  17  3 
3  18  4 
3  19  1 
3  20  2 

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

cust order1 order2 order3 order4 
1  12  14  13 
2  16  15 
3  19  20  17 18 

Итак, как я выбираю второй, третий минимальный ранг для заполнения поля order2, order3, order4?

EDIT: Я не хочу делать ряды 1,2,3 и т. Д., Потому что иногда не может быть ранга 2, поэтому поле order2 будет пустым, но поле order3 будет заполнено. Я хочу сделать минимальный ранг. Первый минимальный ранг в Заказ1, второй минимальный ранг в order2 и т.д.

+0

После Вашего edit Я обновил свой ответ. Надеюсь, это поможет. – DirkNM

ответ

0

использовать комбинацию ROW_NUMBER() и PIVOT, как это:

DECLARE @tmp TABLE (Customer INT, OrderNumber INT, Ranking INT) 
INSERT INTO @tmp (Customer, OrderNumber, Ranking) 
SELECT 1,  12,  1 UNION 
SELECT 1,  13,  3 UNION 
--SELECT 1,  14,  2 UNION 
SELECT 2,  15,  2 UNION 
SELECT 2,  16,  1 UNION 
SELECT 3,  17,  3 UNION 
SELECT 3,  18,  4 UNION 
SELECT 3,  19,  1 UNION 
SELECT 3,  20,  2 


SELECT 
    Customer, 
    MAX(Order1) AS Order1, 
    MAX(Order2) AS Order2, 
    MAX(Order3) AS Order3, 
    MAX(Order4) AS Order4 
FROM 
    (
    SELECT 
     *, 
     'Order' + CAST(ROW_NUMBER() OVER (PARTITION BY Customer ORDER BY Ranking) AS VARCHAR(4)) AS rn 
    FROM @tmp 
) d 
PIVOT 
    (
    MAX(OrderNumber) FOR rn IN ([Order1], [Order2], [Order3], [Order4]) 
) p 
GROUP BY Customer 
+0

Мне нравится ваше представление о Ранге над полем Ранга. Это мастерский удар. – Sam

+0

Рад помочь! Если это решает ваш вопрос, пожалуйста, рассмотрите [его принятие] (http://meta.stackexchange.com/q/5234/179419), щелкнув галочку. Это указывает более широкому сообществу, что вы нашли решение и дали некоторую репутацию как самому, так и самому себе. Это не обязательно. – AHiggins

0
SELECT R1.cust#, R1.order#, R2.order#, r3.order#, r4.order# 
FROM MyTable AS R1 
LEFT JOIN MyTable AS R2 ON R1.cust# = R2.cust# AND R2.rank = 2 
LEFT JOIN MyTable AS R3 ON R1.cust# = R3.cust# AND R3.rank = 3 
LEFT JOIN MyTable AS R4 ON R1.cust# = R4.cust# AND R4.rank = 4 
WHERE R1.rank = 1 
0

Может быть, это помогает:

SELECT cust#, 
     MAX(CASE WHEN rank = 1 THEN order# END) AS order1, 
     MAX(CASE WHEN rank = 2 THEN order# END) AS order2, 
     MAX(CASE WHEN rank = 3 THEN order# END) AS order3, 
     MAX(CASE WHEN rank = 4 THEN order# END) AS order4  
    FROM(SELECT cust#, 
       order#, 
       ROW_NUMBER() OVER (PARTITION BY cust# ORDER BY order#) rank 
     FROM your_table 
    ) 
GROUP 
    by cust#  
Смежные вопросы