SQL Query获取给定年份的给定月份的票数

时间:2015-06-23 16:24:50

标签: sql-server crystal-reports

这是我到目前为止所得到的:

SELECT ToText("CLSDDATE",'MMMM yyyy'),COUNT("PRIORITY") AS TotalPerMonthLow
FROM "TRACKIT_DATA2"."TrackItApp_1"."vTASKS_BROWSE"
WHERE "PRIORITY" = 'Low - 3 Days'
AND YEAR("CLSDDATE") > '2012'
GROUP BY MONTH("CLSDDATE")

这是有效的(除了ToText,但概念就在那里),但它将所有1月份的所有门票组合在一起。理想情况下,此查询将返回一个如下所示的表:

  1. 2012年1月 - 103
  2. 2012年2月 - 114
  3. 2012年3月 - 121
  4. ...

    1. 2015年1月 - 451
    2. 2015年2月 - 472
    3. 这将用于绘制Crystal Report中多年运营的票证履行趋势。它将在散点图中,因此我认为MonthYear列可能只是从2012年1月开始编号为索引。

3 个答案:

答案 0 :(得分:0)

在GROUP BY中重复相同的计算字段

SELECT ToText("CLSDDATE",'MMMM yyyy'),COUNT("PRIORITY") AS TotalPerMonthLow
FROM "TRACKIT_DATA2"."TrackItApp_1"."vTASKS_BROWSE"
WHERE "PRIORITY" = 'Low - 3 Days'
AND YEAR("CLSDDATE") > '2012'
GROUP BY ToText("CLSDDATE",'MMMM yyyy'), MONTH("CLSDDATE")

答案 1 :(得分:0)

使用分组依据和分阶段来强制执行命令:

SELECT DATEDIFF(m,CONVERT(DATETIME,'2013-11-01',120),"CLSDDATE") AS MonthsFromNov2013,COUNT("PRIORITY") AS TotalPerMonthLow
FROM "TRACKIT_DATA2"."TrackItApp_1"."vTASKS_BROWSE"
WHERE "PRIORITY" = 'Low - 3 Days'
AND ((YEAR("CLSDDATE") = '2013' AND MONTH("CLSDDATE") >= '11') OR YEAR("CLSDDATE") > '2013')
GROUP BY DATEDIFF(m,CONVERT(DATETIME,'2013-11-01',120),"CLSDDATE")
ORDER BY DATEDIFF(m,CONVERT(DATETIME,'2013-11-01',120),"CLSDDATE")

答案 2 :(得分:0)

你必须按年份和月份进行分组,否则你们将2012年2月,2013年2月,2014年2月的所有组合在一起。 Month()只返回1到12之间的数字。

第一种方法的另一个问题是您尝试使用表达式CLSDDATE中的ToText("CLSDDATE",'MMMM yyyy')列。在进行分组之后,SQL现在有多个CLSDDATE值(每组超过一行)用于评估该表达式,因此无法确定您想要哪一个。 (Sybase和MySQL等其他平台会接受它,但基本上随机取一组值。)

ToText()不是SQL Server函数(它是一个Crystal公式函数),但假设您可以使用ToText(MIN("CLSDDATE"),'MMMM yyyy')代替它。较新版本的SQL Server确实有DATEFORMAT()

您的月份索引解决方案可能是完美的。如果你需要重建一个真实的日期值,你可以使用一个表达式,该表达式的计算结果是给定月份和年份的月份的第一天,如下所示。

SELECT
    DATEADD(
        mm,
        MONTH(CLSDDATE) - 1,
        DATEADD(
            yy,
            YEAR(CLSDDATE),
            CAST('20000101' AS DATETIME)
        )
    ),
    COUNT(PRIORITY) AS TotalPerMonthLow
FROM TRACKIT_DATA2.TrackItApp_1.vTASKS_BROWSE
WHERE PRIORITY = 'Low - 3 Days' AND YEAR(CLSDDATE) > '2012'
GROUP BY YEAR(CLSDDATE), MONTH(CLSDDATE)