【问题标题】:Get Group By Column in result set without using CTE在不使用 CTE 的情况下在结果集中按列分组
【发布时间】:2021-05-03 09:25:36
【问题描述】:

这是以下查询

select CAST(DepositeDate AS DATE) as DepositeDate,SUM(TotalAmount) as Amount
from Payment
group by DepositeDate 

我得到以下结果。

DepositeDate | Amount | 
2021-04-30   | 50     | 
2021-04-30   | 50     | 
2021-04-26   | 75     | 
2021-04-11   | 30     | 
2021-04-11   | 30     | 

但我需要以下结果

DepositeDate | Amount | 
2021-04-30   | 100    | 
2021-04-26   | 75     | 
2021-04-11   | 60     |  

不使用 CTE 是否可行?

【问题讨论】:

  • 这会返回正确的结果吗? select CAST(DepositeDate AS DATE) as DepositeDate,SUM(TotalAmount) as Amount from Payment group by CAST(DepositeDate AS DATE)
  • 是的@sagi,感谢您的帮助。
  • 不使用 CTE 的原因是什么?

标签: sql sql-server tsql


【解决方案1】:

显然,您的 DepositeDate 列包含时间组件。重复GROUP BY中的表达式:

select CAST(DepositeDate AS DATE) as DepositeDate,
       SUM(TotalAmount) as Amount
from Payment
group by CAST(DepositeDate AS DATE) 
order by CAST(DepositeDate AS DATE);

SQL Server 无法识别 GROUP BY 中的别名。所以DepositeDate 总是会引用FROM 子句中定义的列,而不是select 中的表达式。

【讨论】:

    【解决方案2】:

    执行 DRY principle 的 Gordon 答案的一个稍微干净的版本是将转换放入 APPLY

    这意味着您只需将转换定义为date 一次,并且可以在查询的所有其他部分使用它

    select v.DepositeDate,
           SUM(p.TotalAmount) as Amount
    from Payment p
    cross apply (values (CAST(p.DepositeDate AS DATE) ) ) v(DepositeDate)
    group by v.DepositeDate
    order by v.DepositeDate;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      • 2012-07-04
      • 1970-01-01
      • 1970-01-01
      • 2019-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多