【问题标题】:SQL Server : conditonal aggregation different to mysql?SQL Server:与 mysql 不同的条件聚合?
【发布时间】:2018-07-10 08:35:59
【问题描述】:

我昨天发布了一个问题,Gordon Linoff 回答得很好。

基本上我使用的是 MySQL,需要删除 where 语句,因为它会影响所有列,而这不是需要的,条件聚合是我的答案,它适用于 MySQL。

查询如下:

select 
    sum(amount) as `total amount for all items sold`,
    count(amount) as `Total items sold`,
    sum(sale_made between '2018-07-02' and '2018-07-05') as `half total days`
from
    sales; 

同样,这在 MySQL 中完美运行,但在 SQL Server 2017 中,我在这里遇到错误 '2018-07-05')

【问题讨论】:

  • 您在数据库中的日期格式是否相同? “2018-07-05”
  • 参考这个:stackoverflow.com/a/5125106/3454439。注意日期使用'/'。
  • 我不经常使用 SQL Server,但我猜你可能不得不用不同的方式写你的日期:/我不太确定
  • 感谢您的回复,我实际上是在声明变量,例如 - 声明 startDate 日期时间 声明 endDate 日期时间 set endDate = getdate() set startDate = dateadd(day,-11,endDate) --get 上个月从当前日期开始。我以前一直在搞乱 sql server,以前写日期从来没有遇到过这样的问题
  • 总和(如果 sale_made 在 '2018-07-02' 和 '2018-07-05' 之间然后 1 else 0 end)

标签: sql sql-server count aggregate-functions between


【解决方案1】:

在 MySQL 表达式中,可以为真或假,计算结果为 1 或 0。因此,MySQL 中的 sale_made between '2018-07-02' and '2018-07-05' 可以为 1 或 0,具体取决于 sale_made 是否在相应的范围内。并且可以将数字 0 或 1 相加。

SQL Server 没有将逻辑表达式转换为数字的功能。这样的表达式在任何不期望逻辑表达式的上下文中都是非法的。因此,您必须自己使用CASE 进行“翻译”。

CASE
  WHEN sale_made BETWEEN '2018-07-02'
                         AND '2018-07-05' THEN
    1
  ELSE
    0
END

【讨论】:

    【解决方案2】:

    你只需要一个case 表达式:

    select sum(amount) as [total amount for all items sold],
           count(amount) as [Total items sold],
           sum(case when sale_made between '2018-07-02' and '2018-07-05' then 1 else 0 end) as [half total days]
    from sales; 
    

    请注意,这也会更改列别名的转义字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-28
      • 1970-01-01
      • 2017-08-18
      • 2020-11-19
      • 2016-07-28
      • 1970-01-01
      • 2016-01-29
      • 2021-04-17
      相关资源
      最近更新 更多