【问题标题】:Count orders by days of the week, adding Saturday & Sunday counts to Friday按一周中的天数计算订单,将周六和周日计数添加到周五
【发布时间】:2012-04-18 11:31:56
【问题描述】:

我想获取周一到周日的订单数量,但是将周六和周日的订单添加到周五,所以查询结果只会显示 Orderdates (Monday to Friday)

我已经有这个显示一周中每一天的订单的 sql:

select DATENAME(weekday,orderdate) Day,CONVERT(VARCHAR(10), orderdate, 103) orderdate, 
COUNT(orderdate) Orders  
from Orders_tb
where orderDate >= '2012-03-01 00:00:00.000'  
and orderDate <= '2012-03-31 00:00:00.000'  
group by datepart(day,orderDate),orderdate,DATENAME(weekday,orderdate)

感谢您的意见!

【问题讨论】:

    标签: tsql date


    【解决方案1】:

    编辑澄清后。

    用例将周末更改为星期五。使用派生表是为了避免在需要 orderdate 的地方复制相同的表达式。

    select DATENAME(weekday,orderdate_trimmed) Day,
           CONVERT(VARCHAR(10), orderdate_trimmed, 103) orderdate, 
           COUNT(orderdate_trimmed) Orders
    from 
    (
      select *, 
             order_date -
             case DATENAME(weekday,orderdate)
                  when 'Saturday' then 1
                  when 'Sunday' then 2
                  else 0
              end
             orderdate_trimmed
        from Orders_tb
    ) a
    where orderDate >= '2012-03-01 00:00:00.000'
      and orderDate <= '2012-03-31 00:00:00.000'
    group by orderdate_trimmed
    

    您可以仅通过使用 case 语句来计算匹配天数:

    select COUNT(orderdate) TotalOrders,
           COUNT(CASE WHEN DATENAME(weekday,orderdate) = 'Monday' then 1 end) Monday,
           COUNT(CASE WHEN DATENAME(weekday,orderdate) = 'Tuesday' then 1 end) Tuesday,
           COUNT(CASE WHEN DATENAME(weekday,orderdate) = 'Wednesday' then 1 end) Wednesday,
           COUNT(CASE WHEN DATENAME(weekday,orderdate) = 'Thursday' then 1 end) Thursday,
           COUNT(CASE WHEN DATENAME(weekday,orderdate) = 'Friday' 
                        OR DATENAME(weekday,orderdate) = 'Saturday' 
                        OR DATENAME(weekday,orderdate) = 'Sunday'
                      THEN 1 end) Friday
    from Orders_tb
    where orderDate >= '2012-03-01 00:00:00.000'  
    and orderDate <= '2012-03-31 00:00:00.000'  
    

    关于日期的警告:由于日期可以包含时间部分,这样比较会更明智:

    where orderDate >= '2012-03-01 00:00:00.000'  
    and orderDate < '2012-04-01 00:00:00.000'  
    

    【讨论】:

    • 感谢 Nikola 的回复,您的查询为我提供了我正在寻找的内容,但我希望数据按 orderdate 分组,而不是将一周中特定日期的所有订单相加。就像我的原始查询,我需要在查询中使用 group by 子句来实现这一点.....有什么想法吗?
    • @user851971 所以你真正需要的是把周末改到周五?
    • @user851971 请检查我答案的编辑部分。
    • 将 where 条件放在内部选择中会更有效吗?
    • @JamesJiao 我想优化器产生相同的执行计划并不重要,至少在我有限的测试中是这样。不过也不会痛。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    相关资源
    最近更新 更多