¿Cómo clasifico por un grupo acumulado?
Frecuentes
Visto 51 veces
0
Digamos que tengo una tabla en SQL Server 2008 R2 llamada Purchase
con dos columnas: Purchaser
y Expenditure
.
Digamos que la tabla tiene las siguientes filas:
Purchaser Expenditure
--------- -----------
Alex 200
Alex 300
Alex 500
Bob 300
Bob 400
Charlie 200
Charlie 600
Derek 100
Derek 300
Ahora tengo esta consulta:
SELECT Purchaser, Expenditure, SUM(Expenditure) AS SumExpenditure FROM Purchase GROUP BY Purchaser, Expenditure WITH ROLLUP
Esto devuelve lo siguiente:
Purchaser Expenditure SumExpenditure
--------- ----------- --------------
Alex 200 200
Alex 300 300
Alex 500 500
--------------------------------
Alex NULL 1000
--------------------------------
Bob 300 300
Bob 400 400
--------------------------------
Bob NULL 700
--------------------------------
Charlie 200 200
Charlie 600 600
--------------------------------
Charlie NULL 800
--------------------------------
Derek 100 100
Derek 300 300
--------------------------------
Derek NULL 400
--------------------------------
(Líneas agregadas para enfatizar las cantidades acumuladas).
Lo que me gustaría sería poder ordenar los grupos por las cantidades agrupadas para terminar con un conjunto de resultados como este:
Purchaser Expenditure SumExpenditure
--------- ----------- --------------
Derek 100 100
Derek 300 300
--------------------------------
Derek NULL 400
--------------------------------
Bob 300 300
Bob 400 400
--------------------------------
Bob NULL 700
--------------------------------
Charlie 200 200
Charlie 600 600
--------------------------------
Charlie NULL 800
--------------------------------
Alex 200 200
Alex 300 300
Alex 500 500
--------------------------------
Alex NULL 1000
--------------------------------
En otras palabras, estoy ordenando los grupos, usando el 400
, 700
, 800
y 1000
en las filas del grupo en orden ascendente.
¿Alguien puede sugerir qué consulta devolvería este conjunto de resultados?
1 Respuestas
0
;WITH x AS
(
SELECT Purchaser, Expenditure, s = SUM(Expenditure)
FROM dbo.Purchase
GROUP BY Purchaser, Expenditure WITH ROLLUP
),
y AS
(
SELECT Purchaser, s FROM x
WHERE Expenditure IS NULL
AND Purchaser IS NOT NULL
),
z AS
(
SELECT Purchaser, s, rn = ROW_NUMBER() OVER (ORDER BY s)
FROM y
)
SELECT x.Purchaser, x.Expenditure, x.s FROM x
INNER JOIN z ON x.Purchaser = z.Purchaser
ORDER BY z.rn, CASE WHEN z.s IS NULL THEN 2 ELSE 1 END;
contestado el 04 de mayo de 12 a las 04:05
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas sorting sql-server-2008-r2 grouping or haz tu propia pregunta.