2013-12-21 2 views
1

보고서에 대해 정의 된 그룹화가있는 결과 집합이 있습니다. 위치가 지정되지 않았으므로 "Grid_Group"이 없을 가능성이 있습니다. 이 경우에는 99라는 값을 할당합니다.이 순서는 다음을 제외하고 올바르게 작동합니다. 99는 항상 첫 번째이며 마지막으로 사용해야합니다 (내린 경우 맨 아래에 있음). 내가 Grid_Group에 의해 주문 내에서뿐만 아니라 선택 측면에 캐스팅을 시도했지만 둘 다 맨 위에 99와 동일한 결과가 있습니다. (Sql server 2008)사례 값 선택 순서가 올바르게 정렬되지 않음.

다음은 스 니펫이며 다른 모든 불필요한 열은 제거합니다.

SELECT s.SessionNumber,Position.PositionName,(Select CASE when dbo.Position.Grid_Group is null THEN 99 ELSE dbo.Position.Grid_Group END) as Grid_Group 
      FROM dbo.USession AS us Left Outer JOIN 
        dbo.Position ON us.PositionId = dbo.Position.PositionId FULL OUTER JOIN 
        dbo.Sessions AS s ON us.SessionId = s.SessionId 
        ORDER BY S.SessionNumber, dbo.Position.Grid_Group 

생각 하시겠습니까?

+1

99를 적용 할 CTE가 없으며 '주문'에 '사례'도 없습니다. 그래서 아마 NULL을 주문할 것입니다. BTW에서는 ['ISNULL'] (http://msdn.microsoft.com/en-us/library/ms184325.aspx) 또는 ['COALESCE'] (http://msdn.microsoft.com/en-us)를 사용할 수 있습니다. /library/ms190349.aspx)를 사용하여 null을 지정할 수 있습니다. – Rup

답변

1

귀하의 주문에 대해서도 CASE을 적용해야합니다 (정렬 작업에서 색인 사용이 망가질 수 있음을 명심하십시오). ORDER BY이 별칭 결과 열이 아니라 원래 표의 열을 참조하고 있습니다. 이 같은 트릭을해야합니다 :

SELECT 
    s.SessionNumber,Position.PositionName, 
    (CASE 
     WHEN dbo.Position.Grid_Group IS NULL THEN 99 
     ELSE dbo.Position.Grid_Group 
    END) AS Grid_Group 
FROM dbo.USession AS us 
LEFT OUTER JOIN dbo.Position ON us.PositionId = dbo.Position.PositionId 
FULL OUTER JOIN dbo.Sessions AS s ON us.SessionId = s.SessionId 
ORDER BY 
    S.SessionNumber, 
    (CASE 
     WHEN dbo.Position.Grid_Group IS NULL THEN 99 
     ELSE dbo.Position.Grid_Group 
    END) 

SQL의 일부 부 포맷을 적용 할 수있었습니다.

+0

감사합니다. 합병 및 케이스 모두 주문에 따라 예상 결과를 제공했습니다 – PGB

+0

잘 듣고 다행입니다. 그렇습니다. 'COALESCE'는 당신의 논리를 표현하는 좀 더 공상적인 방법이 될 것입니다. 나는 이것을'CASE' 표현 대신에 사용하는 것을 추천합니다. – kastermester

1

ORDER BY에는 계산 된 열이 표시되지 않습니다. 당신이 요구하는 효과를 얻으려면 ORDER BY 같은 식 (kastermester의 답을 보여주고 있습니다)을 가져야합니다. 또는 공통 테이블 식과 ORDER BY에서 쿼리를 래핑하면됩니다.

WITH cte AS (
    SELECT s.SessionNumber, p.PositionName, COALESCE(p.Grid_Group, 99) Grid_Group 
    FROM dbo.USession AS us 
    LEFT OUTER JOIN dbo.Position p ON us.PositionId = p.PositionId 
    FULL OUTER JOIN dbo.Sessions s ON us.SessionId = s.SessionId 
) 
SELECT * FROM cte ORDER BY SessionNumber, Grid_Group; 
관련 문제