我正在尝试按案例陈述的结果进行分组。
当我按同一个表中的值进行分组时,它可以正常工作:
Select
Case
When @Col = 1 Then YEAR(tbl1.myDate1)
When @Col = 2 Then YEAR(tbl1.myDate2)
End as [Year],
SUM(tbl1.myValue) as [Total]
From tabel1 as tbl1
Group By Case
When @Col = 1 Then YEAR(tbl1.myDate1)
When @Col = 2 Then YEAR(tbl1.myDate2)
End
但是当我在 case 语句中插入来自不同表的值时,它会崩溃并出现如下错误:
tabel1.myDate1 is not contained in an aggregate function or group by clause.
tabel1.myDate2 is not contained in an aggregate function or group by clause.
Select
Case
When @Col = 1 Then YEAR(tbl1.myDate1)
When @Col = 2 Then YEAR(tbl1.myDate2)
When @Col = 3 Then YEAR(tbl2.myDate)
End as [Year],
SUM(tbl1.myValue) as [Total]
From tabel1 as tbl1
Left Join tabel2 as tbl2
On tbl1.tbl2ID = tbl2.ID
Group By Case
When @Col = 1 Then YEAR(tbl1.myDate1)
When @Col = 2 Then YEAR(tbl1.myDate2)
When @Col = 3 Then YEAR(tbl2.myDate)
End
我很好奇为什么会出现此错误,因为这两个字段显然都包含在 group by 子句中。
此外,第一个代码示例表明按大小写分组是可以的。 为什么只有当我包含不同的表时才会出现此错误?
最佳答案
对于诸如此类的复杂查询,一种相当便宜且也使查询更具可读性的技术是使用内联 View ,如下所示:
select Year, Sum(myValue) as Total
from (
select
Case
When @Col = 1 Then YEAR(tbl1.myDate1)
When @Col = 2 Then YEAR(tbl1.myDate2)
When @Col = 3 Then YEAR(tbl2.myDate)
End as [Year],
tbl1.myValue
From tabel1 as tbl1
Left Join tabel2 as tbl2
On tbl1.tbl2ID = tbl2.ID
)
Group By Year
注意双表 case 语句是如何在内联 View 中完成的,然后分组是作为第二遍完成的。需要注意的是,第二遍不执行任何额外的 I/O,这就是为什么使用这种技术相对便宜(而且方便)。
祝你好运!
关于sql - 按不同表中的案例进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34206917/