【问题标题】:SQL Count No of Mondays tuesdays etc from yearSQL Count No of Mondays tuesdays etc from year
【发布时间】:2013-09-21 18:31:55
【问题描述】:

我想创建一个表格,如下表所示,按月份显示本年度每周日的计数。

我知道我需要使用 with 语句,但还没有设法破解它。

我正在使用 MS SQL Server 2008 r2,我也是 SQL 的初级人员,因此我们将不胜感激任何帮助

预期输出:

Month       Mon Tue Wed Thu Fri Sat Sun Sum
-------------------------------------------
January     4   5   5   5   4   4   4   31
February    4   4   4   4   4   4   4   28
March       4   4   4   4   5   5   5   31
April       5   5   4   4   4   4   4   30
May         4   4   5   5   5   4   4   31
June        4   4   4   4   4   5   5   30
July        5   5   5   4   4   4   4   31
August      4   4   4   5   5   5   4   31
September   5   4   4   4   4   4   5   30
October     4   5   5   5   4   4   4   31
November    4   4   4   4   5   5   4   30
December    5   5   4   4   4   4   5   31

【问题讨论】:

  • 提示:你需要 DATEPART 和多个 SUM(CASE WHEN)
  • 你真正使用的是哪个数据库?
  • 你有没有机会解释一下这个查询是如何工作的历年日历与数据库中数据的差异。

标签: sql tsql sql-server-2008-r2 pivot datepart


【解决方案1】:
-- count weekdays in a year
declare @y int = 2013
declare @d datetime = dateadd(year, @y - 1900, 0)

;with cte
as
(
    select 1 a, 
      left(datename(weekday, @d), 3) b,
      datename(month, 0) Month,
      1 sort
    union all
    select a + 1 a, 
      left(datename(weekday, @d + a), 3) b, 
      datename(month, @d + a) Month, 
      datepart(month, @d + a) sort
    from cte where a < datepart(dayofyear, dateadd(year, 1, @d)-1)
)
select month, [Mon],[Tue],[Wed],[Thu],[Fri],[Sat],[Sun], 
     [Mon]+[Tue]+[Wed]+[Thu]+[Fri]+[Sat]+[Sun] [Sum] 
from cte
pivot (count(a) FOR [b] IN ([Mon],[Tue],[Wed],[Thu],[Fri],[Sat],[Sun],[Sum])) AS pvt
order by sort 
option (maxrecursion 366)

【讨论】:

  • 太棒了!这也显示了递归使用 cte 以及如何用第二个 cte 调用第一个 cte 的热门。让我大吃一惊……
  • 你就是炸弹,正是我所需要的,非常高兴。
猜你喜欢
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
  • 2014-12-12
  • 1970-01-01
  • 2011-03-06
  • 2011-02-03
相关资源
最近更新 更多