SQL Server:根据过去6个月的当前日期排序

时间:2017-05-10 18:20:14

标签: sql-server

SELECT 
    Month(gl.CREATEDDATETIME) Month,
    COUNT(CASE 
             WHEN gl.marketcode IN ('059', '017', '032', '013', '014', '042', '004', '025', '020')
                --AND DATEADD(month, DATEDIFF(month, 0, gl.createddatetime), 0) =  '4/1/2017  12:00:00 AM'
                THEN 
                   (CASE 
                       WHEN DATEDIFF(DAY, gl.processdate, gl.createddatetime) >= 0 
                          THEN 'total'
                       WHEN DATEDIFF(DAY, gl.processdate, gl.createddatetime) >= 4 
                          THEN 'outside SLA'
                    END)
            END) AS 'US Outside SLA' 
FROM 
    GL1025 gl 
JOIN 
    MAINDATA ON gl.id = MAINDATA.chargetransactionid 
WHERE 
    gl.createddatetime >= DATEADD(month, -6, GETDATE()) 
GROUP BY
    MONTH(gl.CREATEDDATETIME)
ORDER BY
    MONTH(GETDATE())

我试过这个我得到的答案是

Month  US OutsideSLA
--------------------
  3       25830
 12       20654
  1       17821
  4       20684
  2       23777
 11       16379

我正在寻找的答案是

 4       20684
 3       25830
 2       23777
 1       17821
12      20654
11      16379

我甚至尝试了descFormat(GETDATE(), 'yyyy-MM')

有人可以帮忙吗?请

3 个答案:

答案 0 :(得分:0)

你不应该这样说:

Order by YEAR(go.CREATEDATETIME) DESC, Month(gl.CREATEDDATETIME) DESC

而不是

Order by Month(GetDate())?

GetDate()的月份是常量,因此行将按优化程序选择的任何顺序排列。 GetDate()只返回一个日期,而不是你想要做的...你试图按每行上的日期排序,而不是“现在”。

答案 1 :(得分:0)

您的查询有GROUP BY MONTH(gl.CREATEDDATETIME),因此最终结果每月会有一行。

你不能简单ORDER BY gl.CREATEDDATETIME DESC,因为你正在分组。

您也不能写ORDER BY YEAR(gl.CREATEDATETIME) DESC, MONTH(gl.CREATEDDATETIME) DESC,因为您没有按年分组。

所以,你有两个选择:

按年份和月份分组

SELECT
    ...
GROUP BY
    YEAR(gl.CREATEDDATETIME)
    ,MONTH(gl.CREATEDDATETIME)
ORDER BY
    YEAR(gl.CREATEDDATETIME) DESC
    ,MONTH(gl.CREATEDDATETIME) DESC

在排序

时从每个月获取一些日期
SELECT
    ...
GROUP BY
    MONTH(gl.CREATEDDATETIME)
ORDER BY
    MIN(gl.CREATEDDATETIME) DESC

答案 2 :(得分:0)

主要问题是你没有解释你的输出。

您希望将结果集分成4个,然后按顺序排列每个组。

这是对的吗?

declare @t table(Months int,USOutsideSLA bigint)
insert into @t VALUES
( 3 ,25830)
,(12 ,20654)
,( 1 ,17821)
,( 4 ,20684)
,( 2 ,23777)
,(11 ,16379)

;with CTE as
(
select * 

,ROW_NUMBER()over(order by months)rn
from @t
)

select months,USOutsideSLA
,ROW_NUMBER()over(order by months desc)rn1
from CTE where rn<=4
union ALL
select months,USOutsideSLA
,ROW_NUMBER()over(order by months desc)rn1
from CTE where rn>4 and rn<=8
相关问题