簡體   English   中英

按日期和小時對t-SQL進行分組

[英]t-SQL Grouping by Day and Hours

我需要確定一周和周末的銷售數量,但應將周末計算為星期五下午6點到星期一上午9點​​之間。

例如,如果我有以下數據:

2017-02-09 14:00
2017-02-09 19:00
2017-02-10 17:15
2017-02-10 18:22
2017-02-11 11:00
2017-02-11 16:00
2017-02-12 19:30
2017-02-13 08:00
2017-02-14 14:00

我會得到以下信息:

Weekday: 4
Weekend: 5

使用以下方法很容易獲得每天的銷售額:

select count(*) as total, dateadd(DAY,0, datediff(day,0, created) as created
from sales
group by dateadd(DAY,0, datediff(day,0, created))

但是我想不起來如何結合時間和天數來獲取所需的信息。

這只是一個復雜的case陳述。 您可以使用outer apply來執行此操作,並使用該值進行聚合:

select weekpart, count(*)
from sales s outer apply
     (values (case when datename(dw, created) in ('Tuesday', 'Wednesday', 'Thursday') then 'Weekday'
                   when datename(dw, created) = 'Monday' and 
                        datepart(hh, created) >= 9
                   then 'Weekday'
                   when datename(dw, created) = 'Friday' and 
                        datepart(hh, created) < 18
                   then 'Weekday'
                   else 'Weekend'
               end)
      ) v(weekpart)
group by v.weekpart;

這有意地在工作日使用datename() 星期幾受國際化設置的影響。 所有講英語的國家/地區在工作日都使用相同的名稱,但是當地的約定可能會影響工作日的開始日期。 我還認為,對於非英語設置,代碼非常清楚為什么不起作用-與“ 1”相比是不可行的。

試試這樣的事情:

SELECT week_or_weekend, count(*)
FROM
(
    SELECT 1 as cnt, CASE WHEN 
    DATEPART(DW, created) in (7,1)
    OR
    (DATEPART(DW, created) 6 AND DATEPART(hour, created) >= 18)
    OR
    (DATEPART(DW, created) 2 AND DATEPART(hour, created) < 9)
    THEN 'WEEKEND'
    ELSE 'WEEK'
    END week_or_weekend 
    FROM sales
) q
GROUP BY week_or_weekend

說明:DW = 7代表星期六,1代表星期日,6代表星期五,2代表星期一,我將1作為cnt進行澄清,因為除非您在子查詢中添加了一個與眾不同的內容,否則它無用。 您可以在1個查詢中執行此操作,但必須重復兩次大的“ case when end”語句。

with CTE as
(
select created,
  case when 
   (datepart(dw,[created]) = 6 and  datepart(hh,created) >= 18) or
   (datepart(dw,created)=7 or datepart(dw,created)=1) or 
   (datepart(dw,[created]) = 2 and  datepart(hh,created) <= 9)
   then 'Weekend'
  else 'Weekday' end as weekType
 from Table1)
 select weekType, count(1)
 from CTE
 group by weekType

在此處檢查: http : //sqlfiddle.com/#!6/4fbb0/8

這將使您開始:

with CTE as
(
select dateadd(hh, datepart(hh,created), dateadd(dd,0, datediff(dd,0,created))) as created_dayhour, 
       someothercolumn, 
       datepart(dw,created) as create_day, 
       datepart(hh, created) as create_hour
from sales
)
select created_dayhour, count(someothercolumn)
from CTE
group by created_dayhour

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM