最终,我希望我的最终结果如下所示:
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
and RIGHT OUTER JOIN
this 的表到我的工作表,这样AssetClass
即使没有数据,我也可以返回所有的 's。
我的脚本如下所示:
;;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
?有什么我遗漏的东西或者我可以在我的脚本中改进的东西吗?