2011-09-04 16 views
9

tengo que crear una columna row_number ordenado por una suma agrupados, cuando se utiliza SQL:no se puede usar un alias en ROW_NUMBER() en SQL Server?

select Sales.Name, SUM(Sales.Bill) as billsum, ROW_NUMBER() over (order by billsum DESC) as rn 
from Sales group by Sales.Name 

En ella se informa de error porque row_number más No se puede analizar el alias "billsum", tengo que escribir:

select Sales.Name, SUM(Sales.Bill) as billsum, ROW_NUMBER() over (order by SUM(Sales.Bill) DESC) as rn 
from Sales group by Sales.Name 

así que aquí escribo SUM (Sales.Bill) dos veces, ¿hay alguna forma de usar el alias aquí?

+2

definiendo el alias en otra parte de la consulta, tal como una [CTE o Aplicar] (http://stackoverflow.com/questions/7269195/is-it-possible-to-reuse- aggregate-functions-results-in-the-same-select/7269212 # 7269212) parte. Celko explica por qué [aquí] (http://joecelkothesqlapprentice.blogspot.com/2006/06/reference-alias-field-name.html) –

Respuesta

0

Posibles soluciones temporales son utilizar CTE o una subconsulta:

SELECT Name, billsum, ROW_NUMBER() OVER (ORDER BY billsum DESC) AS rn 
FROM 
    (SELECT Sales.Name, SUM(Sales.Bill) AS billsum 
    FROM Sales 
    GROUP BY Sales.Name 
) tmp 
2

Como ya se ha dicho por otro miembro que sea necesario utilizar CTE o subconsulta.

No solo Row_Number() funciona, pero en tsql no puede hacer referencia a un alias en la misma consulta, por lo que debe utilizar uno de los mencionados anteriormente o la expresión que utilizó en su publicación. ¡¡Espero que tenga sentido!! :) Sólo

-1
-- Reorder after cutting out qty = 0. 
SELECT *,ROW_NUMBER() OVER (partition by claimno ORDER BY itemno) as 'alias name' 
from dbo.OrderCol 
where QTY <> 0 
+0

Esto realmente no es correcto. Y la pregunta fue respondida * correctamente * hace mucho tiempo. – RichardTheKiwi

Cuestiones relacionadas