Principales respuestas
ordenar meses de una consulta

Pregunta
-
buenos dias , estoy haciendo la siguiente consulta a mi bd .
select distinct datename (month,activitydate) from tabla
y me arroja los meses diferentes pero,desordenados,y yo quisiera verlso en orden como enero, febrero, .....diciembre
como puedo realizar la operacion.
Respuestas
-
Tienes razón. Prueba con
;WITH mnths AS (
SELECT datename (month,activitydate) AS nombre, MIN(activitydate) AS activitydate
FROM tabla
GROUP BY datename (month,activitydate)
)
SELECT nombre FROM mnths ORDER BY MONTH(activitydate)
- Propuesto como respuesta Carlos Sacristan lunes, 10 de enero de 2011 16:17
- Marcado como respuesta Augusto C lunes, 10 de enero de 2011 20:53
-
Bueno, Carlos ya dio la solucion asi que solo voy a expandir un poquito.
Este problema es interesante, ya que no podemos ordernar por el nombre del mes sino por el numero pero como no tenemos el numero en la litsta de columnas entonces no podemos hacerlo.
En una sentencia normal (sin DISTINCT) podemos referenciar la columna [activitydate] en la clausula ORDER BY, sin necesidad de referenciarla en la lista de columnas de la clausula SELECT, pero al usar DISTINCT las cosas cambian.
select datename([month], activityname) as m
from T
order by activityname;Si hay mas de una fila por mes, entonces los nombres saldran duplicados, asi que al tratar:
select DISTINCT datename([month], activityname) as m
from T
order by activityname;obtenemos el error "ORDER BY items must appear in the select list if SELECT DISTINCT is specified.".
Una solucion es la dada por Carlos, otra seria incluir el # del mas como parte del resultado:
select DISTINCT datename([month], activityname) as m, month(activitydate) as [m_#]
from T
order by [m_#];Tambien podemos usar una tabla derivada y una expresion CASE, pero esta opcion sera dependiente del lenguahe en uso.
with rs as (
select DISTINCT datename([month], activityname) as m
from T
)
select m
from rs
order by
CASE m
WHEN 'Enero' THEN 1
...
WHEN 'Diciembre' THEN 12
ELSE '0';
END;
AMB
- Marcado como respuesta Augusto C lunes, 10 de enero de 2011 20:54
Todas las respuestas
-
Prueba con
;WITH mnths AS (SELECT DISTINCT datename (month,activitydate) AS nombre, activitydate FROM tabla)
SELECT nombre FROM mnths ORDER BY MONTH(activitydate)
- Propuesto como respuesta Carlos Sacristan lunes, 10 de enero de 2011 14:38
-
-
Tienes razón. Prueba con
;WITH mnths AS (
SELECT datename (month,activitydate) AS nombre, MIN(activitydate) AS activitydate
FROM tabla
GROUP BY datename (month,activitydate)
)
SELECT nombre FROM mnths ORDER BY MONTH(activitydate)
- Propuesto como respuesta Carlos Sacristan lunes, 10 de enero de 2011 16:17
- Marcado como respuesta Augusto C lunes, 10 de enero de 2011 20:53
-
Bueno, Carlos ya dio la solucion asi que solo voy a expandir un poquito.
Este problema es interesante, ya que no podemos ordernar por el nombre del mes sino por el numero pero como no tenemos el numero en la litsta de columnas entonces no podemos hacerlo.
En una sentencia normal (sin DISTINCT) podemos referenciar la columna [activitydate] en la clausula ORDER BY, sin necesidad de referenciarla en la lista de columnas de la clausula SELECT, pero al usar DISTINCT las cosas cambian.
select datename([month], activityname) as m
from T
order by activityname;Si hay mas de una fila por mes, entonces los nombres saldran duplicados, asi que al tratar:
select DISTINCT datename([month], activityname) as m
from T
order by activityname;obtenemos el error "ORDER BY items must appear in the select list if SELECT DISTINCT is specified.".
Una solucion es la dada por Carlos, otra seria incluir el # del mas como parte del resultado:
select DISTINCT datename([month], activityname) as m, month(activitydate) as [m_#]
from T
order by [m_#];Tambien podemos usar una tabla derivada y una expresion CASE, pero esta opcion sera dependiente del lenguahe en uso.
with rs as (
select DISTINCT datename([month], activityname) as m
from T
)
select m
from rs
order by
CASE m
WHEN 'Enero' THEN 1
...
WHEN 'Diciembre' THEN 12
ELSE '0';
END;
AMB
- Marcado como respuesta Augusto C lunes, 10 de enero de 2011 20:54
-
select distinct datename (month,activitydate) as Mes into #temp -- creas una tabla temporal e insertar alli los registros arrojados de la consulta from tabla select mes from #temp -- seleccionas la tabla temporal en el orden que desess order by mes drop table #temp -- borras la tabla temporal -- LISTO!!!
-
select distinct datename (month,activitydate) as Mes into #temp -- creas una tabla temporal e insertar alli los registros arrojados de la consulta from tabla select mes from #temp -- seleccionas la tabla temporal en el orden que desess order by mes drop table #temp -- borras la tabla temporal -- LISTO!!!
Me inmagino que no has usado este codigo, porque los meses no saldran ordenados en sequencia segun el numero del mes. Por ejemplo, si uso la tabla [Northwind].[dbo].[Orders] y la columna [OrderDate], entonces el resultado de este script seria:
Abril
Agosto
Diciembre
Enero
Febrero
Julio
Junio
Marzo
Mayo
Noviembre
Octubre
SeptiembrePero el OP lo desea en order cronologico:
Enero
Febrero
Marzo
Abril
Mayo
Junio
Julio
Agosto
Septiembre
Octubre
Noviembre
DiciembreAdemas, no hace falta usar una tabla temporal intermedia para conseguir este resultado.
AMB
-
-
YA LO TENGO
select distinct datename (month,activitydate), dateadd(m, datediff(m, 0, activitydate), 0) AS INICIOMES -- CONVIERTE TODOS DIAS A INICIO MES JEJE POR TATNO HACE FUNCIONAR EL SELECT DITINCT from tabla order by INICIOMES
- Propuesto como respuesta kakaroto2012 lunes, 10 de enero de 2011 19:10