【发布时间】:2017-09-05 22:52:01
【问题描述】:
我有一个有趣的查询,其中的聚合排序不正确,因为它以字母数字顺序排列日期,因为它们是字符串 (VARCHARS)。如下。
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;
结果如下所示
如您所见,月份是按字母数字排序的,而不是按 DATE 排序的。
现在我对聚合查询绝对是残酷的,所以我的努力是改变 ORDER BY 行,以便它以某种方式解析“月份”列中的年和月,然后按年和月解析订单,而不改变结构数据返回。
这完全可能吗,或者我认为的方法是不可能的,或者是错误的思考方式?
【问题讨论】:
-
只是不要按 DATENAME 订购。只需使用“ORDER BY DATEPART(mm,DeployDate) 等等
标签: sql sql-server