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
我甚至尝试了desc
和Format(GETDATE(), 'yyyy-MM')
有人可以帮忙吗?请
答案 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