J'ai une requête:
select distinct ',' + quotename(CONVERT(VARCHAR(11), createdate, 113)) from CRM for xml path('');
Cela fonctionne bien et donnez-moi cette string:
,[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]
Le problème est qu'il ne sortingera pas la colonne en tant que Date
mais en tant que string. J'ai essayé de sortinger la colonne à l'intérieur de la requête interne:
select distinct ',' + quotename(dt) from (select CONVERT(VARCHAR(11), createDate, 113) as dt from crm order by dt asc) for xml path('');
mais pas de succès, il dit:
Erreur 1033: La clause ORDER BY n'est pas valide dans les vues, les fonctions inline, les tables dérivées, les sous-requêtes et les expressions de table communes, sauf si TOP ou FOR XML est également spécifié.
Quelqu'un s'il vous plaît aidez-moi à régler ce problème? Merci beaucoup d'avance, j'apprécie toute aide!
Cela fonctionne très bien si vous utilisez un group by
plutôt que 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('');
Spécifiez le top 100 percent
dans la sous-requête pour autoriser la command:
(select top 100 percent CONVERT(VARCHAR(11), createDate, 113) as dt from crm order by dt asc)
Vous pouvez également omettre entièrement la sous-requête. Le distinct
nécessite que vous sortingez sur la colonne exacte que vous select:
select distinct ',' + quotename(CONVERT(VARCHAR(11), createdate, 113)) from CRM order by ',' + quotename(CONVERT(VARCHAR(11), createdate, 113)) for xml path('');
EDIT: En réponse à votre commentaire, vous pouvez order sur createDate
au lieu de 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('')
En raison de la distinct
, cela ne fonctionne qu'avec une sous-requête.