2014-10-28 4 views
0

고객 번호가있는 테이블, 주문 번호 & 계급 필드가 있습니다. 각 고객 번호는 서로 다른 순위 값을 갖는 여러 개의 주문을 가질 수 있습니다. 전의.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 필드를 채우는?

편집 : 순위 1,2,3 등으로 원하지 않습니다. 순위 2가 없기 때문에 order2 필드는 비어 있지만 order3 필드는 채워집니다. 최소 순위로하고 싶다. order1에서 1 최소 순위, order2 등

+0

당신의 후 편집 내 대답을 업데이트했습니다. 희망이 도움이됩니다. – 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#