10

ケースステートメント内に計算を追加して、新しい列の内容を動的に作成したいのですが、エラーが発生します:

列 'Test1.qrank' は、集計関数にも GROUP BY 句にも含まれていないため、選択リストでは無効です。

これは私が取り組んでいるコードです

case 
    when test1.TotalType = 'Average' then Test2.avgscore
    when test1.TotalType = 'PercentOfTot' then (cnt/SUM(test1.qrank))
    else cnt
end as displayscore

グループ化を試みましたが、うまくいきませんでした。

ヒントはありますか?

4

3 に答える 3

22

投稿したエラーは、SELECT に含めずに GROUP BY ステートメントで句を使用しているときに発生する可能性があります。

これは機能します!

     SELECT t.device,
            SUM(case when transits.direction = 1 then 1 else 0 end) ,
            SUM(case when transits.direction = 0 then 1 else 0 end) from t1 t 
            where t.device in ('A','B') group by t.device

これはそうではありません(選択からt.deviceを省略)

     SELECT 
            SUM(case when transits.direction = 1 then 1 else 0 end) ,
            SUM(case when transits.direction = 0 then 1 else 0 end) from t1 t 
            where t.device in ('A','B') group by t.device

これにより、選択に含まれていないものをグループ化しているというエラーが発生します

より多くのサポートを受けるには、すべてのクエリを入力してください。

于 2012-09-27T19:39:33.560 に答える
1

共通テーブル式を使用して最初に SUM を作成し、それをテーブルに結合してから、必要に応じて WHEN を使用して CTE または元のテーブルから値を取得できます。

WITH PercentageOfTotal (Id, Percentage) 
AS 
(
    SELECT Id, (cnt / SUM(AreaId)) FROM dbo.MyTable GROUP BY Id
)
SELECT 
    CASE
        WHEN o.TotalType = 'Average' THEN r.avgscore
        WHEN o.TotalType = 'PercentOfTot' THEN pt.Percentage
        ELSE o.cnt
    END AS [displayscore]
FROM PercentageOfTotal pt
    JOIN dbo.MyTable t ON pt.Id = t.Id
于 2012-09-27T19:39:20.983 に答える
0

SQL Server 2005 以降を使用している場合は、ウィンドウ機能を使用できますSUM() OVER ()

case 
when test1.TotalType = 'Average' then Test2.avgscore
when test1.TotalType = 'PercentOfTot' then (cnt/SUM(test1.qrank) over ())
else cnt
end as displayscore

ただし、実際に必要なもののコンテキストを取得するために完全なクエリを表示する方がよいでしょう。

于 2012-09-27T19:26:17.887 に答える