2009-01-20 25 views
6

Estoy tratando de recuperar una lista de cadenas de fecha ordenados por fecha como esta ...El uso de ORDER BY en SELECT DISTINCT en TSQL

SELECT DISTINCT CONVERT(Varchar(10), GeneratedDate, 101) AS GeneratedDate 
FROM dbo.ProviderProcessGeneratedDate 
ORDER BY GeneratedDate 

Este pedidos por el varchar que convirtió las fechas para.

ejemplo ...
02/01/2008
02/15/2008
02/21/2007
02/23/2007
02/29/2008

He trabajado alrededor de esto usando una consulta en línea ...

SELECT CONVERT(Varchar(10), a.GeneratedDate, 101) AS GeneratedDate 
FROM (SELECT DISTINCT Convert(DATETIME,CONVERT(Varchar(10), GeneratedDate, 101)) AS GeneratedDate 
     FROM dbo.ProviderProcessGeneratedDate) a 
ORDER BY a.GeneratedDate DESC 

Para obtener lo que realmente quiero .. .
01/11/2008
01/04/2008
12/28/2007
12/21/2007

¿Existe una manera más fácil? Parece mucho trabajo hacer algo tan simple.

Respuesta

1
SELECT DISTINCT Convert(DATETIME,CONVERT(Varchar(10), GeneratedDate, 101)) 
        AS GeneratedDate, 
     A.GeneratedDate OrderByDate  
    FROM dbo.ProviderProcessGeneratedDate A 
    Order By A.GeneratedDate Desc 
+0

El problema es que quiero pedir por algo g además de lo que está en la cláusula Select Select. Entonces no me dejará. SELECT DISTINCT CONVERT (Varchar (10), GeneratedDate, 101) Proporciona este error ... Los elementos ORDER BY deben aparecer en la lista de selección si se ha especificado SELECT DISTINCT. – ctrlShiftBryan

+0

Sí, es por eso que agregué A.GeneratedDate a la cláusula de selección –

+0

, no necesita estar en la cláusula de selección, solo necesita ser imparcial acerca de qué ordenar. (Usaste el prefijo "A." en la cláusula ORDER BY, pero el interrogador no ...) – MatBailie

0

Creo que se puede utilizar:

ORDER BY dbo.ProviderProcessGeneratedDate.GeneratedDate 

para forzarlo a utilizar el valor de la tabla original, en lugar de su nuevo valor modificado? Incluso se puede añadir un alias a la cláusula FROM:

FROM dbo.ProviderProcessGeneratedDate ppgd 

Así que se puede utilizar el alias de "PPGD" en lugar de todo el nombre de tabla en mi primera declaración.

+0

No puedo porque ... Los elementos ORDER BY deben aparecer en la lista de selección si se especifica SELECT DISTINCT. – ctrlShiftBryan

0

¿Quizás solo necesite usar otro alias de campo para que use la fecha para el pedido en lugar de la cadena formateada? Es decir.

SELECT DISTINCT CONVERT(Varchar(10), GeneratedDate, 101) AS GeneratedDateString 
FROM dbo.ProviderProcessGeneratedDate 
ORDER BY GeneratedDate 

Aunque en la mayoría de los casos que realmente debería estar saliendo de la fecha como una fecha y hacer cualquier formato requerido en la interfaz de usuario en el último momento posible.

+0

en lugar de usar un alias diferente, especifique la tabla en la cláusula ORDER BY (ProviderProcessGeneratedDate.GeneratedDate) – MatBailie

1

sólo para añadir a las respuestas anteriores ...

Usted puede convertir de nuevo a la cadena exterior de tsql. Simplemente devuelva el tipo de fecha y hora y conviértalo a un formato de fecha que desee en el código (capa de visualización).

0

Modificar el ORDER BY de su estado original para usar una cadena de fecha se puede ordenar:

SELECT DISTINCT CONVERT(Varchar(10), GeneratedDate, 101) AS GeneratedDate 
FROM dbo.ProviderProcessGeneratedDate 
ORDER BY CONVERT(Varchar(10), GeneratedDate, 112) 
2

La razón de su primera consulta dio un orden diferente de lo que quería decir ...
- utiliza el campo "GeneratedDate" para crear la cadena de
- A continuación, alias que resultan campo para "GeneratedDate"
- A continuación, ordenado por "GeneratedDate", sin especificar la tabla
- Así que el campo de resultado está siendo utilizado para pedir

la solución simple es mencionado en otras respuestas ...

ORDER BY ProviderProcessGeneratedDate.GenerateDate 

al especificar la mesa no hay confusión y se obtiene teh resultados deseados.


[aparte]

Como regla Siempre prefijo de mis campos con [Tabla]. para evitar cualquier ambigüedad Especialmente porque a menudo vuelvo más tarde y agrego una unión, forzando a la ned por el nombre de la tabla.

Además, alias los nombres de las tablas. No a cosas como [a], sino a algo significativo como [Fechas]. Esto acorta la consulta, pero también me permite cambiar la tabla que se utiliza sin tener que cambiar otras referencias a ella en otras partes de la consulta.

[final del lado]

EDIT:

He dejado mi respuesta anterior a través de humillarme. Realmente debería obtener un servidor SQL casero para que pueda probar mi respuesta antes de publicar mi respuesta ... *** Disculpas *

Como dice el comentario, no puede especificar algo en el ORDER BY si no está en el SELECCIONE DISTINCT.

Por lo tanto me gustaría probar GROUP BY lugar ...

SELECT 
    Convert(DATETIME,CONVERT(Varchar(10), GeneratedDate, 101)) 
FROM 
    ProviderProcessGeneratedDate 
GROUP BY 
    GeneratedDate 
ORDER BY 
    GeneratedDate 

Esto supone GeneratedDate es de 1: 1 con la fórmula de convertir. Si, por ejemplo, tiene un TIEMPO en sus campos de Fecha Generada, pero su Formato de Fecha en CONVERTIR no; necesita que se deben eliminar el tiempo desde el campo GeneratedDate ...

SELECT 
    Convert(DATETIME,CONVERT(Varchar(10), DATEADD(DAY, DATEDIFF(DAY, 0, GeneratedDate), 0), 101)) 
FROM 
    ProviderProcessGeneratedDate 
GROUP BY 
    DATEADD(DAY, DATEDIFF(DAY, 0, GeneratedDate), 0) 
ORDER BY 
    DATEADD(DAY, DATEDIFF(DAY, 0, GeneratedDate), 0) 
+0

especificar el nombre de la tabla no funciona tampoco: SELECT DISTINCT CONVERT (Varchar (10), GeneratedDate, 101) AS GeneratedDatex FROM dbo.ProviderProcessGeneratedDate ORDEN POR ProviderProcessGeneratedDate.GeneratedDate/* error: los elementos ORDER BY deben aparecer en la lista de selección si se especifica SELECT DISTINCT. * / – Hao

1

También puede utilizar CTE de si está utilizando SQL 2005 o 2008.

su código se vería así:

WITH Dates(GeneratedDate) AS 
(
SELECT DISTINCT CONVERT(Varchar(10), GeneratedDate, 101) AS GeneratedDate 
FROM dbo.ProviderProcessGeneratedDate 
) 

SELECT GeneratedDate FROM Dates ORDER BY GeneratedDate 
0

uso GROUP BY en lugar de DISTINCT:

SELECT 
    CONVERT(Varchar(10), GeneratedDate, 101) AS GeneratedDate 
FROM 
    dbo.ProviderProcessGeneratedDate AS BaseDates 
GROUP BY 
    BaseDates.GeneratedDate, 
    CONVERT(Varchar(10), GeneratedDate, 101) 
ORDER BY 
    BaseDates.GeneratedDate 
Cuestiones relacionadas