分组中的案例陈述,为什么这不起作用? SQL Server中的动态聚合

时间:2015-03-03 16:40:58

标签: sql-server tsql

我正在尝试创建一个查询,该查询按几列中的一列聚合一些数据。 (只是期待一个,但也非常有兴趣听到多种解决方案!)。

我创建了以下查询,但它不起作用。它抱怨所有列

  

在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

我非常有兴趣听到为什么会出现这种情况,因为在运行查询时,始终会对正确的列进行分组。显然我也对我的问题的解决方案感兴趣,但是会继续自己搞清楚。

Declare @AggregateColumn int = 1

SELECT
    ResultID,
    CASE
        WHEN @AggregateColumn = 1 THEN Col1
        WHEN @AggregateColumn = 2 THEN Col2
        WHEN @AggregateColumn = 3 THEN Col3
        WHEN @AggregateColumn = 4 THEN Col4
        WHEN @AggregateColumn = 5 THEN Col5
        ELSE 'ERROR'
    END AS ResultName,
    SUM(a.ResultValue) AS ResultValue
FROM
    #Results
GROUP BY
    ResultID,
    CASE
        WHEN @AggregateColumn = 1 THEN Col1
        WHEN @AggregateColumn = 2 THEN Col2
        WHEN @AggregateColumn = 3 THEN Col3
        WHEN @AggregateColumn = 4 THEN Col4
        WHEN @AggregateColumn = 5 THEN Col5
        ELSE null
    END

感谢您的时间。

编辑:感谢您的回复...我在问题中添加了一个额外的拼写错误。基本上我自己修复了这个问题。如果你已经完成了我上面所做的事情,SQL会返回非常无用的错误消息。即Else'ERROR'需要为null。你从来没有意识到这是问题,虽然从SQL给出的错误消息!

2 个答案:

答案 0 :(得分:1)

通过以下方式删除组中的别名:

GROUP BY
    ResultID,
CASE
    WHEN @AggregateColumn = 1 THEN Col1
    WHEN @AggregateColumn = 2 THEN Col2
    WHEN @AggregateColumn = 3 THEN Col3
    WHEN @AggregateColumn = 4 THEN Col4
    WHEN @AggregateColumn = 5 THEN Col5
    ELSE null
END -- AS ResultName

答案 1 :(得分:0)

基本上我自己解决了这个问题。如果你已经完成了我已经完成的工作,SQL将返回非常无用的错误消息。

即Else'ERROR'需要为null。你从来没有意识到这是问题,虽然从SQL提供的错误消息!它抱怨所有其他专栏。

Declare @AggregateColumn int = 1

SELECT
    ResultID,
    CASE
        WHEN @AggregateColumn = 1 THEN Col1
        WHEN @AggregateColumn = 2 THEN Col2
        WHEN @AggregateColumn = 3 THEN Col3
        WHEN @AggregateColumn = 4 THEN Col4
        WHEN @AggregateColumn = 5 THEN Col5
        ELSE null
    END AS ResultName,
    SUM(a.ResultValue) AS ResultValue
FROM
    #Results
GROUP BY
    ResultID,
    CASE
        WHEN @AggregateColumn = 1 THEN Col1
        WHEN @AggregateColumn = 2 THEN Col2
        WHEN @AggregateColumn = 3 THEN Col3
        WHEN @AggregateColumn = 4 THEN Col4
        WHEN @AggregateColumn = 5 THEN Col5
        ELSE null
    END