2012-09-19 16 views
5

Il mio amico mi ha inviato i comandi che ha scritto sul server 2008 e ha funzionato senza problemi, il mio tuttavia da copia e passato non ha funzionato con 2012. È c'è qualche ragione per cui? Ecco il codice:SQL 2008 VS 2012 Errore: sintassi errata vicino alla parola chiave "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); 

Ecco l'errore:

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

+0

che è il primo calcolo si sta parlando di – BigDaddyCardona

+0

Eventuali duplicati di [Impossibile eseguire un'istruzione COMPUTE] (http://stackoverflow.com/questions/ 12338697/cant-execute-a-compute-statement) –

risposta

8

COMPUTE non è più disponibile in SQL Server 2012 è, ecco perché si stanno ottenendo quell'errore. Vedere questa pagina:

dire che:

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

*Transact-SQL syntax | COMPUTE/COMPUTE BY *

+0

Cosa non è più disponibile? – BigDaddyCardona

+1

@BigDaddyCardona, questo è quello che dice la pagina, puoi trovarlo in: 'Sintassi Transact-SQL | COMPUTE/COMPUTE BY –

+0

Ok, ho visto che mi dispiace, ma come risolverei COMPUTE BY? Non fornisce una soluzione, usa solo il rollup. Ho provato che non ha funzionato. – BigDaddyCardona

1

È possibile creare qualcosa di simile con GROUPING SETS, ma tutto viene in un unico gruppo di risultati, ad esempio, qualcosa come:

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 

Ho aggiunto GROUPING_ID() che rende più facile a wo rk out se la fonte è un originale, riepilogo alla riga totale.

Mi sono sempre chiesto come si consumerebbe qualcosa del genere in quanto i molteplici set di risultati rendono difficile la gestione. Non puoi passarlo ad un'altra procedura memorizzata, non puoi copiarla incollandola direttamente in Excel (senza fare scherzi), passare a un client .net sarebbe imbarazzante. Come hai consumato il codice precedente?

HTH

3

Una sorta di hack con RollUp dal Compute By è 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 

Risultato

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

O

è possibile utilizzare il seguito

0.123.
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 

L'uscita essendo

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 
Problemi correlati