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です。

@AssetClassこれを取得するために、RIGHT OUTER JOINこれを自分の作業テーブルに呼び出すテーブルを作成して、AssetClassデータがなくてもすべてのを返すことができるようにしました。

私のスクリプトは次のようになります。

;;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

私の問題は、これを1つのポートフォリオに対して実行すると、これが完全に機能することです。これを複数のポートフォリオに対して実行すると、最終的な選択でデータがないものはすべて除外されるように見えるため、上記の例ではBalanced行は返されません。

スクリプトに問題がありますか、それとも外部からの結合方法に問題があり@AssetClassますか?スクリプトに欠けているものや改善できるものはありますか?

4

1 に答える 1

1

これはあなたに役立つ可能性があります
UPDATE 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 に答える