2012-04-06 10 views
13

No puedo entender fallo de este código¿Cómo puedo usar SUMA() OVER()

ID  AccountID  Quantity 
1   1    10   Sum = 10 
2   1    5    = 10 + 5 = 15 
3   1    2    = 10 + 5 + 2 = 17 
4   2    7    = 7 
5   2    3    = 7 + 3 = 10 

SELECT ID, AccountID, Quantity, 
     SUM(Quantity) OVER (PARTITION BY AccountID) AS TopBorcT, 
FROM tCariH 
+4

Mejore la presentación de preguntas y el encuadre. ¿Cuál es la pregunta aquí? – Marshal

+2

Resultados esperados y reales por favor? –

Respuesta

24

parece que espera que la consulta devuelva totales acumulados, pero debe concederle los mismos valores para ambos particiones de AccountID.

Para obtener los totales acumulados con SUM() OVER(), es necesario agregar un sub-cláusula ORDER BY después PARTITION BY …, así:

SUM(Quantity) OVER (PARTITION BY AccountID ORDER BY ID) 

Pero recuerde, no todos los sistemas de bases de datos compatibles con ORDER BY en el OVER cláusula de un agregado ventana función. (Por ejemplo, SQL Server no la apoyó hasta que la última versión, SQL Server 2012.)

+7

Para aclarar esto: una suma() sin un 'orden por' simplemente sumará todos los valores para el grupo definido por la partición. Por cierto: SQL Server fue/es el único (AFAIK) DBMS que admite funciones de ventana sin apoyar una orden por en la cláusula de partición. Los demás (PostgreSQL, Oracle, DB2, Teradata) no tienen esa limitación –

+0

Creo que debe tener razón acerca de los sistemas con soporte limitado de funciones agregadas de ventanas. Sí, sospeché eso, pero no estaba muy seguro. Echando un vistazo a otra pregunta (relacionada) de los OP, ahora puedo ver que SQL Server * es * el sistema de base de datos del OP, especialmente en este caso, y uno anterior a 2012 también. –

+0

Por lo que puedo decir, 'ORDER BY' se agregó en Sql 2005: http://msdn.microsoft.com/en-us/library/ms189461(v=sql.100).aspx –

6

si está utilizando SQL 2012 debe intentar

SELECT ID, 
     AccountID, 
     Quantity, 
     SUM(Quantity) OVER (PARTITION BY AccountID ORDER BY AccountID rows between unbounded preceding and current row) AS TopBorcT, 
FROM tCariH 

si está disponible, mejor ordenado por fecha de la columna.

1

consulta sería la siguiente:

SELECT ID, AccountID, Quantity, 
     SUM(Quantity) OVER (PARTITION BY AccountID) AS TopBorcT 

     FROM #Empl ORDER BY AccountID 

de reparto por obras como agrupar. Aquí estamos agrupando por AccountID para que la suma corresponda a AccountID.

Primera primer caso, AccountID = 1, a continuación, suma (cantidad) = 10 + 5 + 2 => Para AccountID = 2, entonces suma (Cantidad) = 7 + 3 => 10

para que el resultado aparezca como adjunto snapshot.