【问题标题】:SQL query to count based on MM-YYYY part of date基于日期的 MM-YYYY 部分计数的 SQL 查询
【发布时间】:2013-12-12 06:22:58
【问题描述】:

我需要根据工作申请日期显示过去 12 个月的工作申请数量,并且还需要根据工作申请日期对其进行分组

我尝试按照它生成错误,如下所示。

SELECT 
   COUNT(MONTH(ApplicationDate) AS VARCHAR(2)) + '-' + CAST(YEAR(ApplicationDate) AS VARCHAR(4)) AS Total, 
   ApplicationDate 
FROM 
   [Jobs] 
GROUP BY 
   ApplicationDate, ApplicationDate 
ORDER BY
   ApplicationDate 

但这导致了一个错误:

消息 195,第 15 级,状态 10,第 9 行
“COUNT”不是可识别的内置函数名称。

SQL Server 2008 需要它

最终工作解决方案

SELECT   
MONTH(ApplicationDate),   YEAR(ApplicationDate),   COUNT(*) AS Total, 
    (CAST(MONTH(ApplicationDate) AS VARCHAR(2)) + '-' + CAST(YEAR(ApplicationDate) AS VARCHAR(4)))  as ApplicationDate
    FROM    [Jobs] 
GROUP BY    YEAR(ApplicationDate),   MONTH(ApplicationDate)

ORDER BY
       YEAR(ApplicationDate),   MONTH(ApplicationDate)

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:

    您需要尝试这样的方法来获取每个月/年的一行,其中包含该月/年的应用程序计数:

    SELECT
       MONTH(ApplicationDate),
       YEAR(ApplicationDate),
       COUNT(*)
    FROM 
       dbo.[Jobs] 
    GROUP BY 
       YEAR(ApplicationDate),
       MONTH(ApplicationDate)
    ORDER BY
       YEAR(ApplicationDate),
       MONTH(ApplicationDate)
    

    这也计算每月/每年的应用程序并按其分组。你应该得到这样的输出:

    这取自AdventureWorks示例数据库

    如果您执行GROUP BY ApplicationDate,那么您基本上是按实际日期本身(不是月/年部分)进行分组/计数

    更新:如果您必须让 SQL Server 提供 MM-YYYY 格式的格式(确实应该在您的 Web 应用程序中完成,而不是由 SQL Server 完成),然后试试这个:

    ;WITH GroupedData AS
    (
        SELECT
           DateMonth = MONTH(ApplicationDate),
           DateYear = YEAR(ApplicationDate),
           JobsCount = COUNT(*)
        FROM 
           dbo.[Jobs]
        GROUP BY 
           YEAR(ApplicationDate),
           MONTH(ApplicationDate)
    )
    SELECT
        RIGHT('00' + CAST(DateMonth AS VARCHAR(2)), 2) + '-' +
        CAST(DateYear AS VARCHAR(4)),
        JobsCount 
    FROM 
        GroupedData
    ORDER BY
        DateMonth, DateYear
    

    【讨论】:

    • 到目前为止,您的查询得到了正确的结果,但我无法使用它,因为我需要另一列显示 MM-YYYY,我试过但它给了我错误或得到错误的结果。如何用我们的效果结果修改它。
    • @KnowledgeSeeker:更新了我的回复以包含您的格式需求
    【解决方案2】:

    这个怎么样?

     SELECT 
           COUNT(*) AS Total, 
           (CAST(MONTH(ApplicationDate) AS VARCHAR(2)) + '-' + CAST(YEAR(ApplicationDate) AS VARCHAR(4)))  as ApplicationDate 
        FROM 
           [Jobs]  
        GROUP BY 
           (CAST(MONTH(ApplicationDate) AS VARCHAR(2)) + '-' + CAST(YEAR(ApplicationDate) AS VARCHAR(4))) 
        ORDER BY
          ApplicationDate 
    

    cast 函数缺少一个月。输出如下。

    Total   ApplicationDate
    22217   7-2012
    17979   8-2012
    30341   9-2012
    

    为排序而编辑...

    如果您不特别关注“MM-YYYY”格式。将月/年组合转换为数字并按此排序。试试这个。

     SELECT 
       COUNT(*) AS Total, 
       RIGHT(CONVERT(VARCHAR(10), ApplicationDate, 103), 7)  as ApplicationDate, 
       CAST(REPLACE(RIGHT(CONVERT(VARCHAR(10), ApplicationDate, 103), 7), '/', '') as int) as numdate
    FROM 
       [Jobs] 
    GROUP BY 
       RIGHT(CONVERT(VARCHAR(10), ApplicationDate, 103), 7)
    ORDER BY
      numdate,ApplicationDate
    

    【讨论】:

    • MM-YYYY 没有得到想要的多重结果,它显示 1 2012-09-21 1 2013-09-01 2 2013-09-06 2 2013-09-08 1 2013-09-09 3 2013-09-11 1 2013-09-19 1 2013-09-21 2 2013-09-22 15 2013-09-24 1 2013-09-26 2 2013-10-06 1 2013-12-11 1 2013-12-12
    • Ray,我实际上需要在过去 12 个月的工作申请的折线图上显示这个,我需要更正订单。
    • @KnowledgeSeeker 请检查一下
    • 这也可以,但我发现其他 apraoc 基于 Marc_s 解决方案
    【解决方案3】:

    试试这个……

    SELECT  DATENAME(month,ApplicationDate) + ' ' + CAST(DATEPART(year,ApplicationDate) AS VARCHAR(4)),
            COUNT(1) TotalCnt
    FROM    dbo.[Jobs] 
    GROUP BY DATENAME(month,ApplicationDate) + ' ' + CAST(DATEPART(year,ApplicationDate) AS VARCHAR(4))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-18
      • 2016-07-24
      • 2019-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多