【问题标题】:GROUP BY with CASE - tsqlGROUP BY with CASE - sql
【发布时间】:2013-03-01 16:20:46
【问题描述】:

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

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     

我要做的是根据@ReportType 按国家或地区分组,并显示百分比和排名的总和。

但是我不断收到错误:

消息 8120,第 16 层,状态 1,第 349 行
列“@Worktable.Country”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
消息 8120,第 16 层,状态 1,第 350 行
列“@Worktable.Region”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

这太容易了,真的让我很烦。非常感谢您的帮助。

谢谢

【问题讨论】:

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


【解决方案1】:

我相信 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

【讨论】:

  • 知道这很容易,周五下午大脑冻结。干杯伙伴。
【解决方案2】:
select ReportingDate, PortfolioID, PortfolioNme, Country, RANK() OVER (PARTITION BY PortfolioID ORDER BY SUM(Percentage) DESC, CountryOrRegion) AS [Rank],   SUM(Percentage)     AS [Weight]
from (
    SELECT 
            ReportingDate
        ,   PortfolioID
        ,   PortfolioNme
        , CASE WHEN @ReportType = 'GeoCountry' THEN Country WHEN @ReportType = 'GeoEquity' THEN Region END as CountryOrRegion
        ,   CASE
                WHEN @ReportType = 'GeoCountry' THEN Infoportal.dbo.fn_Generic_ProperCase(Country)
                WHEN @ReportType = 'GeoEquity'  THEN Region
            END                 AS Country
    FROM @Worktable as WT
    WHERE WT.IssueType1 <> '010' AND WT.IssueType2 <> '055'
) t
GROUP BY    WT.ReportingDate
        ,   WT.PortfolioID
        ,   WT.PortfolioNme
        ,   CountryOrRegion    

【讨论】:

    猜你喜欢
    • 2017-03-22
    • 2020-10-26
    • 2020-04-01
    • 2021-03-15
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多