我怎样才能得到从最新到最旧的日子
How can I get the days from latest to oldest
第一次使用类似的东西来寻求帮助,所以我不确定我这样做是否正确,但是这里...
我正在尝试让我的日期从最近到最旧。
当我尝试按 [Day] Desc 或 Asc 排序时,它显示不正确。
这是我当前显示的link
有人可以帮忙吗?
DECLARE @StartDate DATETIME = '2018/03/13'
DECLARE @NumDays INT = 11
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@query1 AS NVARCHAR(MAX),
@query2 AS NVARCHAR(MAX),
@query3 AS NVARCHAR(MAX),
@query4 AS NVARCHAR(MAX),
@query5 AS NVARCHAR(MAX)
;with cte as (
SELECT
CAST(DAY(SentTime) AS VARCHAR(MAX)) [Day]
--,CAST((DATENAME(DAY, SentTime)) AS INT) as SentDay
,isnull(count(id),0) 'Total'
,Sum(Case when isnull(IsDeleted,'') <> '' Then 1 else 0 end) Deleted
,Sum(Case when isnull(CallLogTime,'') = '' and isnull(IsDeleted,'')='' Then 1 else 0 end) 'Not Logged'
,Sum(Case when isnull(SentTime,'') = '' and isnull(IsDeleted,'')='' Then 1 else 0 end) 'Received'
,Sum(Case when isnull(CallLogTime,'') <> '' and isnull(IsDeleted,'')='' Then 1 else 0 end) Logged
FROM tblMailItems
WHERE DATEDIFF(dd, SentTime, GETDATE()) <= @NumDays
group by DAY(SentTime) --,CAST((DATENAME(DAY, SentTime)) AS INT)
),
cte2 as (
select * from cte
)
select *
into #X
from cte
union
select 'Row Total', sum(Total), sum(Deleted), sum([not logged]), sum(Received), sum(Logged) from cte2
--drop table #X
select @cols = STUFF((SELECT ',' + QUOTENAME([Day])
from #X
group by DAY
order by DAY asc
FOR XML PATH('')
), 1, 1, '')
--select * from #x
set @query1 = 'select 1 Sequence, ''Total Logged'' [Description], ' + @cols + '
from
(
select [day], total
from #X
) src
pivot
(
sum(total)
for Day in (' + @Cols + ')
) p'
set @query2 = ' UNION select 2 Sequence, ''Deleted'' [Description], ' + @cols + '
from
(
select [day], Deleted
from #X
) src
pivot
(
sum(Deleted)
for Day in (' + @Cols + ')
) p'
Select @query = @query1 + @query2
set @query3 = ' UNION select 3 Sequence, ''Not Logged'' [Description], ' + @cols + '
from
(
select [day], [Not Logged]
from #X
) src
pivot
(
sum([Not Logged])
for Day in (' + @Cols + ')
) p'
select @query = @query1 + @query2 + @query3
set @query4 = ' union select 4 sequence, ''Received'' [description], ' + @cols + '
from
(
select [day], [Received]
from #x
) src
pivot
(
sum([Received])
for day in (' + @cols + ')
) p'
select @query = @query1 + @query2 + @query3 + @query4
set @query5 = ' UNION select 5 Sequence, ''Logged'' [Description], ' + @cols + '
from
(
select [day], [Logged]
from #X
) src
pivot
(
sum([Logged])
for Day in (' + @Cols + ')
) p'
select @query = @query1 + @query2 + @query3 + @query5
execute (@query)
drop table #x
您的 ORDER BY 列 [Day] 转换为 VARCHAR(MAX)。如果日期和时间采用 DATETIME 格式,则它们的排序效率最高。
如评论和答案中所述,在 date(time)
列上排序效率更高。不过我认为您的问题是,排序是在别名 DAY
上进行的,而不是在列 DAY
上进行的。尝试通过别名指定列:
SELECT ',' + QUOTENAME([Day])
from #X as x
group by X.DAY
order by x.DAY asc
第一次使用类似的东西来寻求帮助,所以我不确定我这样做是否正确,但是这里...
我正在尝试让我的日期从最近到最旧。 当我尝试按 [Day] Desc 或 Asc 排序时,它显示不正确。
这是我当前显示的link
有人可以帮忙吗?
DECLARE @StartDate DATETIME = '2018/03/13'
DECLARE @NumDays INT = 11
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@query1 AS NVARCHAR(MAX),
@query2 AS NVARCHAR(MAX),
@query3 AS NVARCHAR(MAX),
@query4 AS NVARCHAR(MAX),
@query5 AS NVARCHAR(MAX)
;with cte as (
SELECT
CAST(DAY(SentTime) AS VARCHAR(MAX)) [Day]
--,CAST((DATENAME(DAY, SentTime)) AS INT) as SentDay
,isnull(count(id),0) 'Total'
,Sum(Case when isnull(IsDeleted,'') <> '' Then 1 else 0 end) Deleted
,Sum(Case when isnull(CallLogTime,'') = '' and isnull(IsDeleted,'')='' Then 1 else 0 end) 'Not Logged'
,Sum(Case when isnull(SentTime,'') = '' and isnull(IsDeleted,'')='' Then 1 else 0 end) 'Received'
,Sum(Case when isnull(CallLogTime,'') <> '' and isnull(IsDeleted,'')='' Then 1 else 0 end) Logged
FROM tblMailItems
WHERE DATEDIFF(dd, SentTime, GETDATE()) <= @NumDays
group by DAY(SentTime) --,CAST((DATENAME(DAY, SentTime)) AS INT)
),
cte2 as (
select * from cte
)
select *
into #X
from cte
union
select 'Row Total', sum(Total), sum(Deleted), sum([not logged]), sum(Received), sum(Logged) from cte2
--drop table #X
select @cols = STUFF((SELECT ',' + QUOTENAME([Day])
from #X
group by DAY
order by DAY asc
FOR XML PATH('')
), 1, 1, '')
--select * from #x
set @query1 = 'select 1 Sequence, ''Total Logged'' [Description], ' + @cols + '
from
(
select [day], total
from #X
) src
pivot
(
sum(total)
for Day in (' + @Cols + ')
) p'
set @query2 = ' UNION select 2 Sequence, ''Deleted'' [Description], ' + @cols + '
from
(
select [day], Deleted
from #X
) src
pivot
(
sum(Deleted)
for Day in (' + @Cols + ')
) p'
Select @query = @query1 + @query2
set @query3 = ' UNION select 3 Sequence, ''Not Logged'' [Description], ' + @cols + '
from
(
select [day], [Not Logged]
from #X
) src
pivot
(
sum([Not Logged])
for Day in (' + @Cols + ')
) p'
select @query = @query1 + @query2 + @query3
set @query4 = ' union select 4 sequence, ''Received'' [description], ' + @cols + '
from
(
select [day], [Received]
from #x
) src
pivot
(
sum([Received])
for day in (' + @cols + ')
) p'
select @query = @query1 + @query2 + @query3 + @query4
set @query5 = ' UNION select 5 Sequence, ''Logged'' [Description], ' + @cols + '
from
(
select [day], [Logged]
from #X
) src
pivot
(
sum([Logged])
for Day in (' + @Cols + ')
) p'
select @query = @query1 + @query2 + @query3 + @query5
execute (@query)
drop table #x
您的 ORDER BY 列 [Day] 转换为 VARCHAR(MAX)。如果日期和时间采用 DATETIME 格式,则它们的排序效率最高。
如评论和答案中所述,在 date(time)
列上排序效率更高。不过我认为您的问题是,排序是在别名 DAY
上进行的,而不是在列 DAY
上进行的。尝试通过别名指定列:
SELECT ',' + QUOTENAME([Day])
from #X as x
group by X.DAY
order by x.DAY asc