按不同表格分组

时间:2015-12-10 16:26:04

标签: sql sql-server

我试图通过案例陈述的结果进行分组。

当我按照同一个表中的值进行分组时,它可以正常工作:

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不包含在聚合函数或group by子句中。

     

tabel1.myDate2不包含在聚合函数或group by子句中。

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子句中。

此外,第一个代码示例显示按案例分组是可以的。 为什么只有当我在这种情况下包含不同的表时才出现此错误?

1 个答案:

答案 0 :(得分:2)

对于诸如此类的复杂查询,使查询更具可读性的相当便宜的技术是使用内联视图,如下所示:

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语句,然后分组作为第二遍完成。重要的是要注意第二遍不进行任何额外的I / O,这就是使用这种技术相对便宜(并且方便)的原因。

祝你好运!