2012-12-13 2 views
1

궁극적으로 내가 같이 내 최종 결과를 싶은 CTE의 문제에 참여 다음오른쪽 외부는

기본적으로
ReportingDate FundCode FundName AssetClass Rank Percentage 
------------------------------------------------------------------------- 
30/11/2012  1   Fund1  Bond   1  50 
30/11/2012  1   Fund1  Equity  2  30 
30/11/2012  1   Fund1  Balanced  3  0 
30/11/2012  1   Fund1  Other   4  20 
30/11/2012  2   Fund2  Equity  1  60 
30/11/2012  2   Fund2  Bond   2  20 
.......  

에 대한 데이터 말 Balanced는 다음과 같이 아직도 내가 것 위의 예처럼 존재하지 않는 경우 내가 얻을 수 있도록 데이터 만이 효율적으로 활용하려면 0

의 비율로 반환 할 나는 모든 AssetClass 년대에도 데이터없이 반환 내 작업 테이블에 @AssetClassRIGHT OUTER JOIN이라는 테이블을 만들었습니다.

내 스크립트는 다음과 같습니다 :이 완벽하게 작동 한 포트폴리오에 대해이 작업을 실행할 때

;;WITH CTE AS 
(
SELECT 
     CASE 
      WHEN ReportingDate IS NULL THEN MAX(ReportingDate) OVER (PARTITION BY (SELECT 1)) 
      ELSE ReportingDate 
     END      AS ReportingDate 

    , CASE 
      WHEN PortfolioID IS NULL THEN MAX(PortfolioID) OVER (PARTITION BY (SELECT 1)) 
      ELSE PortfolioID 
     END      AS PortfolioID 

    , CASE 
      WHEN PortfolioNme IS NULL THEN MAX(PortfolioNme) OVER (PARTITION BY (SELECT 1)) 
      ELSE PortfolioNme 
     END      AS PortfolioNme 

    , AC.AssetClass   AS AssetClass 

    , CASE 
      WHEN AC.AssetClass = 'No Asset Class' THEN 3 
      WHEN AC.AssetClass = 'Other' THEN 2 
      ELSE 1 
     END      AS [Rank] 
    , CAST(SUM(ISNULL(Percentage, 0)) AS DECIMAL(22,1)) AS [Weight] 

FROM @Worktable as WT 

    RIGHT OUTER JOIN @AssetClass AS AC 
     ON RTRIM(WT.AssetClass) = RTRIM(AC.AssetClass) 

GROUP BY WT.ReportingDate, WT.PortfolioID, WT.PortfolioNme, AC.AssetClass 
) 

SELECT 
     CONVERT(VARCHAR, ReportingDate, 103) AS ReportingDate  
    , PortfolioID        AS FundCode 
    , PortfolioNme       AS FundName 
    , AssetClass 
    , RANK() OVER ( PARTITION BY PortfolioID 
         ORDER BY [Rank], [Weight] DESC) AS [Rank] 
    , [Weight]        AS Percentage 
FROM CTE 

ORDER BY ReportingDate, PortfolioID, [Rank], [Weight] DESC 

내 문제가있다. 여러 포트폴리오에 대해이 작업을 실행하면 최종 선택에서 데이터가없는 부분이 제외 된 것처럼 보이므로 위의 예에서는 Balanced 행이 반환되지 않습니다.

내 스크립트에 문제가 있습니까? 아니면 바로 바깥 쪽이 @AssetClass에 가입 했습니까? 실종되었거나 스크립트에서 개선 할 수있는 것이 있습니까?

+0

가 데이터를주고있다 @Worktable 테이블을 도울 수 있는가? –

답변

1

가능성이 당신에게
UPDATE 2013년 3월 1일

;WITH CTE AS 
(
SELECT DISTINCT WT.ReportingDate, WT.PortfolioID, WT.PortfolioNme,   
     AC.AssetClass, 
     CASE WHEN AC.AssetClass = 'No Asset Class' THEN 3 
      WHEN AC.AssetClass = 'Other' THEN 2 
      ELSE 1 END AS [Rank],   
     SUM(CASE WHEN AC.PortfolioID IS NULL THEN 0.00 ELSE WT.Percentage END) 
     OVER(PARTITION BY WT.ReportingDate, WT.PortfolioID, AC.AssetClass) AS [Weight] 
FROM Worktable WT CROSS APPLY (
           SELECT AC2.AssetClass, WT2.ReportingDate, WT2.PortfolioID, 
             WT2.AssetClass AS AssetClass2 
           FROM AssetClass AC2 LEFT JOIN Worktable WT2 
           ON RTRIM(AC2.AssetClass) = RTRIM(WT2.AssetClass) 
            AND WT2.PortfolioID = WT.PortfolioID                
           ) AC 
WHERE (WT.ReportingDate = AC.ReportingDate AND WT.PortfolioID = AC.PortfolioID AND WT.AssetClass = AC.AssetClass) 
     OR (AC.AssetClass2 IS NULL) 
GROUP BY WT.ReportingDate, WT.PortfolioID, WT.PortfolioNme,   
     AC.AssetClass, AC.PortfolioID, WT.Percentage 
) 
SELECT CONVERT(VARCHAR, ReportingDate, 103) AS ReportingDate, 
     PortfolioID AS FundCode, 
     PortfolioNme AS FundName, 
     AssetClass, 
     RANK() OVER (PARTITION BY PortfolioID 
        ORDER BY [Rank], [Weight] DESC) AS [Rank], 
     [Weight] AS Percentage 
FROM CTE 
ORDER BY ReportingDate, PortfolioID, [Rank], [Weight] DESC 
+0

늦어서 죄송합니다. 크리스마스와 새해 때문에 쉬었습니다. '@AssetClass'테이블에는 그 안에 Asset Classes 목록 만 있으므로 위에 제시 한 방식대로 작동하지 않습니다. '@AssetClass'테이블의 자산 클래스에 대한 데이터가없는 경우 Reporting Day, PortfolioID 및 PortfolioNme에 데이터를 채우도록 PARTITION BY를 수행해야했습니다. –

+0

나는 대답을 업데이 트합니다. 지금 해보십시오;) –

+0

조금 느리지 만 완벽하게 작동합니다.하지만 적어도 저에게 일할 무언가를 주셨습니다. 고맙습니다. –