【问题标题】:Group by excluding Null - tsql通过排除 Null 进行分组 - sql
【发布时间】:2013-02-14 12:36:19
【问题描述】:

我在下面有一个脚本:

    ;;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 进行分组,因为我想将相同的 SEDOL 组合在一起,但这会导致 NULLS 组合在一起。我尝试通过在 SEDOL 周围添加一个 MAX 来更改脚本并放置:

CASE 
    WHEN SEDOL IS NULL THEN SecurityName 
    ELSE SEDOL
END

在我的 GROUP BY 中但没有成功。

非常感谢任何帮助。

谢谢

【问题讨论】:

  • 你可以尝试像 ISNULL(SEDOL,SecurityName) as Sese ... 并将 group by 更改为 group by WT.Sese
  • 但我需要在最终选择中返回 SEDOLS,如果它为 null,我需要返回一个 null

标签: sql-server-2008 tsql group-by common-table-expression


【解决方案1】:

听起来您只想在 CTE WHERE 子句中添加 AND WT.SEDOL is not null

【讨论】:

    【解决方案2】:

    怎么样:

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

    【讨论】:

    • 这就是我一直在尝试的。由于某种原因,我无法理解 ISNULL 不起作用,即使我删除了所有聚合和 group by 我仍然无法让 ISNULL 工作。
    • 我将 ISNULL(WT.SEDOL, SecurityName) 更改为: CASE WHEN SEDOL = '' THEN SecurityName ELSE SEDOL END 感谢您的帮助,我知道这很容易
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    相关资源
    最近更新 更多