GROUP BY with CASE - tsql

chr*_*y p 4 t-sql sql-server group-by case common-table-expression

我有一个选择,如下所示:

SELECT 
        ReportingDate
    ,   PortfolioID
    ,   PortfolioNme

    ,   CASE
            WHEN @ReportType = 'GeoCountry' THEN Infoportal.dbo.fn_Generic_ProperCase(Country)
            WHEN @ReportType = 'GeoEquity'  THEN Region
        END                 AS Country

    ,   RANK() OVER (PARTITION BY PortfolioID ORDER BY SUM(Percentage) DESC, CASE WHEN @ReportType = 'GeoCountry' THEN Country WHEN @ReportType = 'GeoEquity' THEN Region END) AS [Rank]
    ,   SUM(Percentage)     AS [Weight]

FROM @Worktable as WT

WHERE WT.IssueType1 <> '010' AND WT.IssueType2 <> '055'

GROUP BY    WT.ReportingDate
        ,   WT.PortfolioID
        ,   WT.PortfolioNme
        ,   CASE
                WHEN @ReportType = 'GeoCountry' THEN WT.Country
                WHEN @ReportType = 'GeoEquity'  THEN WT.Region
            END     
Run Code Online (Sandbox Code Playgroud)

我想要做的是按国家或地区分组,具体取决于@ReportType,并显示百分比和排名的总和.

但是我一直收到错误:

消息8120,级别16,状态1,行349
列'@ Worktable.Country'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中.
消息8120,级别16,状态1,行350
列'@ Worktable.Region'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中.

这很容易,真让我讨厌.非常感谢帮助.

谢谢

Mic*_*son 9

我相信CTE会简化你想要做的事情:

;WITH WT AS (
    SELECT 
        ReportingDate
    ,   PortfolioID
    ,   PortfolioNme

    ,   CASE
            WHEN @ReportType = 'GeoCountry' 
              THEN Infoportal.dbo.fn_Generic_ProperCase(Country)
            WHEN @ReportType = 'GeoEquity'  
              THEN Region
        END AS Country
    ,   Percentage
FROM @Worktable
WHERE IssueType1 <> '010' AND IssueType2 <> '055'
)
SELECT 
        ReportingDate
    ,   PortfolioID
    ,   PortfolioNme
    ,   Country
    ,   RANK() OVER (
          PARTITION BY PortfolioID 
          ORDER BY SUM(Percentage) DESC, Country) AS [Rank]
    ,   SUM(Percentage) AS [Weight]
FROM WT
GROUP BY
        ReportingDate
    ,   PortfolioID
    ,   PortfolioNme
    ,   Country
Run Code Online (Sandbox Code Playgroud)