none
ordenar meses de una consulta RRS feed

  • 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.

    lunes, 10 de enero de 2011 14:29

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
    lunes, 10 de enero de 2011 16:17
  • 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

    Some guidelines for posting questions...

    • Marcado como respuesta Augusto C lunes, 10 de enero de 2011 20:54
    lunes, 10 de enero de 2011 17:29

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)
    lunes, 10 de enero de 2011 14:38
  • Hola, probe con esa query , sale en orden ,pero se repiten los meses.

    saludos.

    lunes, 10 de enero de 2011 14:43
  • 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
    lunes, 10 de enero de 2011 16:17
  • 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

    Some guidelines for posting questions...

    • Marcado como respuesta Augusto C lunes, 10 de enero de 2011 20:54
    lunes, 10 de enero de 2011 17:29
  • 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!!!
    
    lunes, 10 de enero de 2011 18:06
  • 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
    Septiembre

    Pero el OP lo desea en order cronologico:

    Enero
    Febrero
    Marzo
    Abril
    Mayo
    Junio
    Julio
    Agosto
    Septiembre
    Octubre
    Noviembre
    Diciembre

    Ademas, no hace falta usar una tabla temporal intermedia para conseguir este resultado.

     


    AMB

    Some guidelines for posting questions...

    lunes, 10 de enero de 2011 18:19
  • tienes toda la razón mi hermano

    dejame ver otra opción

    la probé con mi tabla pero está indexada por fecha

    por tanto no puede ver ese detalle

    jeje

    lunes, 10 de enero de 2011 19:00
  • 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
    lunes, 10 de enero de 2011 19:08