sql - 按不同表中的案例进行分组

标签 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 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/

相关文章:

sql - 使用 R 对两列进行分组并计算不同值

sql - 如何解决在 Microsoft SQL 中使用 xp_cmdshell 时出现的 "Access is denied"错误?

sql-server - SQL Server中镜像的一对多关系

sql - 如何跨多个数据库向sql server中的列添加外键约束?

sql - 最快的导入方式?

sql - 在网络 PC 上找不到 SQL 实例名称

sql - INNER JOIN 中的多个条件

php - 从结果集中删除避免重复项

mysql - mysql 中关于过程参数的动态 "column"更新

sql - 甲骨文月复一日