这是我到目前为止所得到的:
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月份的所有门票组合在一起。理想情况下,此查询将返回一个如下所示的表:
...
等
这将用于绘制Crystal Report中多年运营的票证履行趋势。它将在散点图中,因此我认为MonthYear列可能只是从2012年1月开始编号为索引。
答案 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)