我有一个有趣的查询,其中包含错误的聚合命令,因为它以字母顺序排列日期,因为它们是字符串(VARCHARS)。它如下。SQL order by concatenated Month and Year字符串
DROP PROCEDURE dbo.DeploymentReport
GO
CREATE PROCEDURE dbo.DeploymentReport
@Date DATE
AS
BEGIN
SELECT TOP 6 DATENAME(MONTH,DeployDate) + ' - ' + DATENAME(YEAR,DeployDate) AS 'Month',
ISNULL(SUM(CASE WHEN OverallRiskRating = 3 THEN 1 END),0) AS 'High',
ISNULL(SUM(CASE WHEN OverallRiskRating = 2 THEN 1 END),0) AS 'Med',
ISNULL(SUM(CASE WHEN OverallRiskRating = 1 THEN 1 END),0) AS 'Low'
FROM dbo.ChangeEvaluationForm cef
INNER JOIN dbo.Package pac
ON cef.ChangeId = pac.ChangeId
INNER JOIN dbo.SDMTicket sdm
ON pac.PackageId = sdm.PackageId
WHERE DeployDate < @Date
GROUP BY DATENAME(MONTH, DeployDate) + ' - ' + DATENAME(YEAR,DeployDate)
ORDER BY DATENAME(MONTH, DeployDate) + ' - ' + DATENAME(YEAR,DeployDate) DESC
END
GO
DECLARE @DateSelected DATETIME
SET @DateSelected = CONVERT(DATE,'2017-12-30')
EXECUTE dbo.DeploymentReport @Date = @DateSelected;
结果如下所示
正如你所看到的月份按日期排序的字母数字代替。
现在我对汇总查询是绝对残酷的,所以我的斗争是改变ORDER BY行,以便以某种方式解析“月”列中的年份和月份,以及年份和月份中的订单,而不更改数据返回的结构。
这是不是可能,或者是我认为不可能的方法或者错误的思维方式?
只是不按DATENAME命令。只需使用“ORDER BY DATEPART(mm,DeployDate)”等等 –