2013-02-14 55 views
2

我有下面的腳本:集團通過排除空 - TSQL

;;WITH CTE AS 
    (
     SELECT 
       RANK() OVER (PARTITION BY PortfolioID ORDER BY SUM(Percentage) DESC,MAX(SecurityName)) AS [Rank] 
      , ReportingDate 
      , PortfolioID 
      , PortfolioNme 
      , MAX(SecurityName)        AS SecurityName 
      , CAST(SUM(Percentage) AS DECIMAL(22,1))   AS [Weight] 
      , SEDOL 
      , MAX(ISIN)          AS ISIN 
     FROM @Worktable as WT 

     WHERE WT.IssueType2 <> '010' AND WT.IssueType2 <> '055' AND WT.IssueType1 <> '110' -- To remove CASH and FX and Collateral 

     GROUP BY WT.ReportingDate 
       , WT.PortfolioID 
       , WT.PortfolioNme 
       , WT.SEDOL 
    ) 

    SELECT 
      CONVERT(VARCHAR, ReportingDate, 103) AS ReportingDate 
     , PortfolioID       AS FundCode 
     , PortfolioNme       AS FundName 
     , SecurityName       AS InstrumentName 
     , [Rank] 
     , [Weight]        AS Percentage 
     , SEDOL 
     , ISIN 
    FROM CTE 

    WHERE [Rank] <= 10 

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

我被SEDOL分組,因爲我想相同組SEDOLs在一起,然而,這是造成NULLS組合到一起。我試着通過添加圍繞SEDOL一個MAX並把改變腳本:

CASE 
    WHEN SEDOL IS NULL THEN SecurityName 
    ELSE SEDOL 
END 

我在GROUP BY,但沒有成功。

任何幫助非常感謝。

感謝

+0

你可以嘗試像ISNULL(SEDOL,SecurityName)作爲澀澀中添加AND WT.SEDOL is not null。 ..和改變組由WT.Sese – futile 2013-02-14 12:41:26

+0

,但我需要返回SEDOLS在最後選擇,它是空的,我需要返回一個空的 – 2013-02-14 12:48:41

回答

0

如何:

;;WITH CTE AS 
    (
     SELECT 
       RANK() OVER (PARTITION BY PortfolioID ORDER BY SUM(Percentage) DESC,MAX(SecurityName)) AS [Rank] 
      , ReportingDate 
      , PortfolioID 
      , PortfolioNme 
      , MAX(SecurityName)        AS SecurityName 
      , CAST(SUM(Percentage) AS DECIMAL(22,1))   AS [Weight] 
      , ISNULL(SEDOL, SecurityName) AS SEDOL 
      , MAX(ISIN)          AS ISIN 
     FROM @Worktable as WT 

     WHERE WT.IssueType2 <> '010' AND WT.IssueType2 <> '055' AND WT.IssueType1 <> '110' -- To remove CASH and FX and Collateral 

     GROUP BY WT.ReportingDate 
       , WT.PortfolioID 
       , WT.PortfolioNme 
       , ISNULL(WT.SEDOL, SecurityName) 
    ) 

    SELECT 
      CONVERT(VARCHAR, ReportingDate, 103) AS ReportingDate 
     , PortfolioID       AS FundCode 
     , PortfolioNme       AS FundName 
     , SecurityName       AS InstrumentName 
     , [Rank] 
     , [Weight]        AS Percentage 
     , SEDOL 
     , ISIN 
    FROM CTE 

    WHERE [Rank] <= 10 

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

這就是我剛剛嘗試。出於某種原因,ISNULL不工作,我不明白,即使我刪除所有聚合和組我仍然無法讓ISNULL工作。 – 2013-02-14 13:54:15

+0

我將ISNULL(WT.SEDOL,安全名稱)更改爲: CASE when SEDOL =''那麼SecurityName ELSE SEDOL END 感謝您的幫助,我知道這將是一件容易的事情 – 2013-02-14 14:05:48

1

這聽起來像你想簡單的CTE WHERE條款