1

最终,我希望我的最终结果如下所示:

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。

为此,我创建了一个名为@AssetClassand RIGHT OUTER JOINthis 的表到我的工作表,这样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?有什么我遗漏的东西或者我可以在我的脚本中改进的东西吗?

4

1 回答 1

1

可能这可以帮助您
更新 03.01.2013

 ;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   
于 2012-12-28T15:32:23.790 回答