4

次のような選択があります。

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 句にも含まれていないため、選択リストでは無効です。

これはとても簡単で、本当にイライラします。助けていただければ幸いです。

ありがとう

4

2 に答える 2

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
于 2013-03-01T16:28:06.460 に答える
1
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    
于 2013-03-01T16:29:35.703 に答える