¿Cómo clasifico por un grupo acumulado?

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?

preguntado el 03 de mayo de 12 a las 16:05

1 Respuestas

;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 or haz tu propia pregunta.