如何在子查询中对列进行排序

时间:2013-08-19 11:09:37

标签: sql sql-server sql-server-2008

我有疑问:

select distinct ',' + quotename(CONVERT(VARCHAR(11), createdate, 113)) 
from CRM 
for xml path('');

运行正常并给我这个字符串:

,[22 Jul 2013],[28 Jul 2013],[03 Aug 2013],[13 Aug 2013],[30 Jul 2013],[23 Jul 2013],[31 Jul 2013],[19 Jul 2013],[05 Aug 2013],[12 Aug 2013],[26 Jul 2013],[18 Jul 2013],[09 Aug 2013],[20 Jul 2013],[25 Jul 2013],[08 Aug 2013],[11 Aug 2013],[07 Aug 2013],[29 Jul 2013],[06 Aug 2013],[02 Aug 2013],[24 Jul 2013],[17 Jul 2013],[14 Aug 2013],[01 Aug 2013],[21 Jul 2013],[10 Aug 2013],[04 Aug 2013],[27 Jul 2013],[16 Jul 2013]

问题是它没有将列排序为Date而是排序为字符串。我尝试在内部查询中对列进行排序:

select distinct ',' + quotename(dt) 
from 
   (select  
        CONVERT(VARCHAR(11), createDate, 113) as dt 
    from crm 
    order by dt asc)  
for xml path('');

但没有成功,它说:

  

错误1033:ORDER BY子句在视图,内联函数,派生表,子查询和公用表表达式中无效,除非还指定了TOP或FOR XML。

有人请帮我解决这个问题吗?非常感谢,我感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

在子查询中指定top 100 percent以允许排序:

(select top 100 percent
        CONVERT(VARCHAR(11), createDate, 113) as dt 
    from crm 
    order by dt asc)  

或者,您可以完全省略子查询。 distinct要求您对所选的确切列进行排序:

select distinct ',' + quotename(CONVERT(VARCHAR(11), createdate, 113)) 
from CRM 
order by ',' + quotename(CONVERT(VARCHAR(11), createdate, 113)) 
for xml path('');

编辑:在回复您的评论时,您可以在createDate而不是dt订购:

select  distinct ',' + quotename(dt) 
from    (
        select  top 100 percent CONVERT(VARCHAR(11), createDate, 113) as dt
        from    crm 
        order by 
                createDate
        )  
for xml path('')

由于distinct,这仅适用于子查询。

答案 1 :(得分:1)

如果您使用group by代替distinct

,它可以正常工作
select ',' + quotename(CONVERT(VARCHAR(11), createDate, 113))
from crm 
group by CONVERT(VARCHAR(11), createDate, 113)
order by CONVERT(datetime, CONVERT(VARCHAR(11), createDate, 113), 113)
for xml path('');