2012-09-19 38 views
5

Mi amigo me envió los comandos que escribió en el servidor 2008 y trabajaron sin problemas, pero el mío de una copia y el pasado no funcionó con 2012. Es Hay alguna razón por qué? Aquí está el código:SQL 2008 VS 2012 Error: Sintaxis incorrecta cerca de la palabra clave 'COMPUTE'

 Use Kudler_Database 
     SELECT AccountNumber, [Description], ShortDescription,Balance 
     FROM Chart_of_Accounts 
     ORDER BY left (AccountNumber, 2) 
     COMPUTE SUM(Balance) BY left (AccountNumber, 2) 
     COMPUTE SUM(Balance); 

Aquí está el error:

Msg 156, Level 15, State 1, Line 6 Incorrect syntax near the keyword 'COMPUTE'.

+0

que es el primer cálculo que está hablando de – BigDaddyCardona

+0

duplicado posible de [No se puede ejecutar una instrucción COMPUTE] (http://stackoverflow.com/questions/ 12338697/cant-execute-a-compute-statement) –

Respuesta

8

COMPUTE ya no está disponible en el servidor SQL 2012 es, por eso vas a encontrar ese error. Ver esta página:

Se dijo que:

This topic describes the Database Engine features that are no longer available in SQL Server 2012:

*Transact-SQL syntax | COMPUTE/COMPUTE BY *

+0

¿Qué ya no está disponible? – BigDaddyCardona

+1

@ BigDaddyCardona, eso es lo que dice la página, puede encontrarlo en: 'sintaxis de Transact-SQL | COMPUTE/COMPUTE POR ' –

+0

Ok, vi eso tarde, lo siento, pero ¿cómo arreglarías el COMPUTE BY? No da una resolución solo usa rollup. Intenté que no funcionó. – BigDaddyCardona

1

Usted puede crear algo similar con conjuntos AGRUPACIÓN pero todo viene en un conjunto de resultados, por ejemplo, algo como:

SELECT AcGroup, AccountNumber, [Description], ShortDescription, SUM(Balance) Balance, GROUPING_ID(AcGroup, AccountNumber) 
FROM (SELECT LEFT(AccountNumber, 2) AcGroup, * FROM Chart_of_Accounts) x 
GROUP BY GROUPING SETS((AcGroup), (AccountNumber, [Description], ShortDescription),()) 

SELECT AcGroup, SUM(Balance) Balance 
FROM (SELECT LEFT(AccountNumber, 2) AcGroup, * FROM Chart_of_Accounts) x 
GROUP BY GROUPING SETS(AcGroup,()) 

SELECT AcGroup, SUM(Balance) Balance 
FROM (SELECT LEFT(AccountNumber, 2) AcGroup, * FROM Chart_of_Accounts) x 
GROUP BY AcGroup WITH CUBE 

He añadido GROUPING_ID() que hace que sea más fácil wo rk out si la fuente es un original, resumen a la fila total.

Siempre me he preguntado cómo se puede consumir algo así, ya que los múltiples resultados hacen que sea difícil de manejar. No puede pasarlo a otro procedimiento almacenado, no puede copiarlo y pegarlo directamente en Excel (sin perder el tiempo), pasarlo a un cliente .net sería incómodo. ¿Cómo consumiste el código anterior?

HTH

3

Una especie de truco con RollUp desde Calcular Por es deprecated in SQL Server 2012 - (see "SQL SERVER – Use ROLL UP Clause instead of COMPUTE BY")

DECLARE @t TABLE(AccountNumber VARCHAR(10),[Description] VARCHAR(100),ShortDescription VARCHAR(100),Balance INT) 
INSERT INTO @t SELECT '1234567890','Some Description for 1st Account','Short Description for 1st Account',2000 Union All 
SELECT '2345678901','Some Description for 2nd Account','Short Description for 2nd Account',3000 Union All 
SELECT '1234567890','Some Description for 1st Account','Short Description for 1st Account',4000 

SELECT 
    AccountNumber 
    ,Balance 
    ,Total = SUM(Balance) 
FROM @t 
GROUP BY AccountNumber,Balance 
WITH ROLLUP 

Resultado

AccountNumber Balance total 
1234567890  2000  2000 
1234567890  4000  4000 
1234567890  NULL  6000 
2345678901  3000  3000 
2345678901  NULL  3000 
NULL   NULL  9000 

O

puede utilizar el siguiente

DECLARE @t TABLE(AccountNumber VARCHAR(10),[Description] VARCHAR(100),ShortDescription VARCHAR(100),Balance INT) 
INSERT INTO @t SELECT '1234567890','Some Description for 1st Account','Short Description for 1st Account',2000 Union All 
SELECT '2345678901','Some Description for 2nd Account','Short Description for 2nd Account',3000 Union All 
SELECT '1234567890','Some Description for 1st Account','Short Description for 1st Account',4000 

;With CTE AS 
(
SELECT 
    AccountNumber 
    ,[Description] 
    ,ShortDescription 
    ,Balance 
    ,SubTotal = SUM(Balance) OVER (PARTITION BY AccountNumber ORDER BY LEFT (AccountNumber, 2)) 
    ,Rn = ROW_NUMBER() OVER(PARTITION BY AccountNumber ORDER BY LEFT (AccountNumber, 2)) 
FROM @t) 
SELECT 
    AccountNumber 
    ,[Description] 
    ,ShortDescription 
    ,Balance = CAST(Balance AS VARCHAR(10)) 
    ,SubTotal = CASE WHEN Rn != 1 THEN NULL ELSE SubTotal END 
FROM CTE 
UNION ALL 
SELECT 
    ' ', ' ',' ' ,'Total Amount' , SUM(Balance) FROM CTE 

La salida es

AccountNumber Description       ShortDescription     Balance SubTotal 
1234567890  Some Description for 1st Account Short Description for 1st Account 2000 6000 
1234567890  Some Description for 1st Account Short Description for 1st Account 4000 NULL 
2345678901  Some Description for 2nd Account Short Description for 2nd Account 3000 3000 
                        Total Amount 9000 
Cuestiones relacionadas