2012-06-07 10 views
5

tengo la siguiente consultapor/ordenado por

select 
    datepart(yy, orderDate) as 'year', 
    datename(mm, OrderDate) as 'month', 
    count(*) as 'Orders' 
from orders  (yeah I know its missing the schema, its from a book) 
group by 
    datepart(yy, orderdate), 
    datename(mm, orderdate) 
order by 
    datepart(yy, orderdate), 
    datename(mm, orderdate); 

que devuelve 3 columnas, pero datename(mm, orderdate) devuelve una cadena y por lo tanto el pedido por ella pone agosto antes de enero etc.

La solución a este fue el siguiente:

select 
    datepart(yy, orderDate) as 'year', 
    datename(mm, OrderDate) as 'month', 
    count(*) as 'Orders' 
from orders (yeah i know its missing the schema, its from a book) 
group by 
    datepart(yy, orderdate), 
    datename(mm, orderdate), 
    datepart(mm, orderdate) 
order by 
    datepart(yy, orderdate), 
    datepart(mm, orderdate); 

todavía estoy un poco confundido con todo el grupo por/ordenado por secciones y cómo funciona realmente.

Por lo que he entendido, agrupar por está creando una tabla de trabajo con 4 columnas (que podría estar mal) datepart(yy, orderdate), datename(mm, orderdate), datepart(mm, orderdate), y una columna count.

Cada vez que encuentra un orderdate que tiene en la mesa de trabajo aumenta el conteo, de lo contrario, agrega una nueva fila?

Originalmente pensé que podía eliminar el DateName(mm, orderdate) dentro del grupo por sección, pero el libro decía que eso no era posible.

Si alguien puede ver lo que sucede detrás de escena/señalar un recurso que explica cómo funciona esto con un poco más de detalle, lo agradezco.

gracias por su ayuda.

+0

¿Cuál es exactamente su pregunta? ¿Estás buscando una explicación de cómo está funcionando tu consulta? –

+0

Estoy confundido en cuanto a cómo funciona esto y originalmente pensé que podría eliminar el DateName de la sección Group By. –

+0

'order by orderdate' no funciona? ¿O usando 'datepart' en lugar de' datename' en la cláusula 'order'? – HABO

Respuesta

7

Cada vez que utilice una función de agregado (COUNT, SUM, MAX, etc.) debe incluir todas las otras columnas en una cláusula GROUP BY. COUNT en su ejemplo devuelve el número de registros que tienen el mismo valor para datepart(yy, orderdate), datename(mm, orderdate), datepart(mm, orderdate).

Un ejemplo:

SELECT col1, col2, col3, MAX(col4) 
FROM MyTable 
GROUP BY col1, col2, col3 

decir esto volvió:

1,2,3,9 
1,2,5,9 

Si ha cambiado su consulta a este:

SELECT col1, col2, MIN(col3), MAX(col4) 
FROM MyTable 
GROUP BY col1, col2 

volvería:

1,2,3,9 

Observe que agregué una función Agregar a col3 (MIN), así que pude eliminar col3 de mi cláusula GROUP BY.

+0

por lo que la tabla de trabajo contiene 4 columnas ¿verdad? –

+0

Realmente no importa cuántas columnas tenga la tabla, importa cuántas seleccione y cuántas de esas columnas seleccionadas tengan una función agregada aplicada. –

+0

Una última pregunta, si eliminé el recuento (*) de la declaración de selección, solo obtendría 2 columnas devueltas, y se ordenarían como estaban antes ¿no? (Supongo que debería usar Distinct() en su lugar). –

Cuestiones relacionadas