【问题标题】:Query last 6 month of data , display by month name [duplicate]查询最近6个月的数据,按月名显示[重复]
【发布时间】:2014-07-29 00:17:44
【问题描述】:

我想获取最近 6 个月的计数记录,并按月显示。如果该月没有任何记录,我需要显示 0。

我的查询是

DECLARE @Date1 DATETIME, @Date2 DATETIME
SET @Date1 = GETDATE()
SET @Date2 = DateAdd(month, -6, Convert(CHAR(10), @Date1, 121))

SELECT 
    DATENAME(MONTH,IssueDate) [Month Name], COUNT(1) [Count]
FROM 
    CompetitiveProcess
WHERE 
    IssueDate BETWEEN @Date2 AND @Date1
GROUP BY 
    YEAR(IssueDate), MONTH(IssueDate), DATENAME(MONTH, IssueDate)

但没有显示没有任何行的月份。谁能帮我解决这个问题?

【问题讨论】:

  • 创建一个表(临时工作),每个月都有 1 行(你可以做一个快速循环来动态填充它)。从查询中的该表开始,然后将其加入计数查询。如果您搜索它,应该是 Stack Overflow 上的大量示例
  • stackoverflow.com/questions/23300303/… 我认为这个答案对你有用
  • 感谢您的快速回复,我从这个帖子stackoverflow.com/questions/16968809/…得到了答案

标签: sql sql-server


【解决方案1】:

只需使用递归 CTE 生成日期,然后 left outer join 即可获取数据:

with dates as (
      select cast(getdate() - day(getdate()) + 1 as date) as monthstart,
             cast(dateadd(month, 1, getdate()) - day(getdate()) as date) as monthend,

             0 as lev
      union all
      select dateadd(month, -1, monthstart), 
             dateadd(day, -1, monthstart),
             lev + 1
      from dates
      where lev < 6
     )
SELECT DATENAME(dates.monthstart, IssueDate) as [Month Name],
       COUNT(cp.issuedate) as [Count]
FROM dates left outer join
     CompetitiveProcess cp
     on IssueDate BETWEEN dates.monthstart and dates.monthend
GROUP BY YEAR(dates.monthstart), MONTH(dates.monthstart), DATENAME(MONTH, dates.monthstart);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 2022-07-13
    • 2022-11-22
    相关资源
    最近更新 更多