궁극적으로 내가 같이 내 최종 결과를 싶은 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
년대에도 데이터없이 반환 내 작업 테이블에 @AssetClass
및 RIGHT 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
에 가입 했습니까? 실종되었거나 스크립트에서 개선 할 수있는 것이 있습니까?
가 데이터를주고있다 @Worktable 테이블을 도울 수 있는가? –