2

クエリがあります:

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 も指定されていない限り、ビュー、インライン関数、派生テーブル、サブクエリ、および共通テーブル式では無効です。

誰かがこの問題を解決する方法を教えてください。事前にどうもありがとう、助けてくれてありがとう!

4

2 に答える 2

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、これはサブクエリでのみ機能します。

于 2013-08-19T11:25:20.023 に答える
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('');
于 2013-08-19T12:20:32.890 に答える