使用DATENAME函数时的SQL Server ORDER BY

时间:2014-04-01 17:07:15

标签: sql sql-server tsql

SELECT CAST(DATEPART(yyyy,DATE1) 
AS varchar (5)) + '-' + CAST(DATENAME(m,ec2.DATE2) 
AS varchar(3)) AS [Month],
CAST(AVG(CAST(DATEDIFF(day,DATE1, DATE2) 
AS DECIMAL(10,2))) AS DECIMAL(10,2)) AS tt
FROM tbl3
GROUP BY CAST(DATEPART(yyyy,DATE1) AS 
varchar (5)) + '-' + CAST(DATENAME(m,ec2.DATE2) 
AS varchar(3))
ORDER BY [Month]

所以在上面的查询中,我有两年不同的结果,所以它的整数明智的排序年份,但根据字母表的几个月(作为其DATENAME) 示例:

2013-Dec 4.45
2013-Nov 5.55
2014-Jan 2.35
2014-Jan 2-85

问题是我在我的聚合函数(DATE2)中使用Avg,因此无法在ORDER BY子句中使用它。

任何人都有解决此问题的方法。如果你能帮助我,我将非常感激。我读了关于这个问题的其他问题,但没有找到解决方案。

提前致谢。

2 个答案:

答案 0 :(得分:2)

一种错综复杂的方式,但适用于任何情况。使用CTE解决您的问题,如下所示:

With CTE as (
SELECT CAST(DATEPART(yyyy,DATE1) 
AS varchar (5)) + '-' + CAST(DATENAME(m,ec2.DATE2) 
AS varchar(3)) AS [Month],
CAST(AVG(CAST(DATEDIFF(day,DATE1, DATE2) 
AS DECIMAL(10,2))) AS DECIMAL(10,2)) AS tt
FROM tbl3
GROUP BY CAST(DATEPART(yyyy,DATE1) AS 
varchar (5)) + '-' + CAST(DATENAME(m,ec2.DATE2) 
AS varchar(3))
Select * from CTE
ORDER BY 
DATEPART(yyyy, cast([Month] as datetime)),
DATEPART(mm, cast([Month] as datetime));

答案 1 :(得分:0)

我同意您可以按照Darius X建议的年/月订购。您还可以使用交叉应用来“包装”您的计算。不确定它会解决您的特定问题,但需要了解其他信息。我在CROSS APPLY中找出MatchStatus然后在SELECT&中使用MatchStatus。 GROUP BY条款。

SELECT
    MatchStatus,
    COUNT(*)
FROM MPI.ACTData.Matches
    CROSS APPLY (SELECT CASE WHEN MatchScore >= 69 THEN 'Match' 
                ELSE 'Review' END MatchStatus) ms
GROUP BY MatchStatus