2012-09-19 205 views
5

我的朋友給我發送了他在服務器2008中編寫的命令,他們的工作沒有問題,但是我的副本和過去在2012年都不起作用。有什麼理由?下面是代碼:SQL 2008 VS 2012錯誤:關鍵字'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); 

以下是錯誤:

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

+0

這是它在說話的[無法執行計算聲明】約 – BigDaddyCardona

+0

可能重複第一計算(http://stackoverflow.com/questions/ 12338697/cant-execute-a-compute-statement) –

回答

8

COMPUTE不再可用在SQL Server 2012中,這就是爲什麼你得到這個錯誤。看到這個頁面:

它說:

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

*Transact-SQL syntax | COMPUTE/COMPUTE BY *

+0

什麼不再可用? – BigDaddyCardona

+1

@BigDaddyCardona,這就是頁面說的,你可以在下面找到它:'Transact-SQL syntax | COMPUTE/COMPUTE BY' –

+0

好的,我看到那個晚了,我很抱歉,但是如何修復COMPUTE BY呢?它不會提供僅使用匯總的解決方案。我試過了,沒有奏效。 – BigDaddyCardona

1

您可以創建GROUPING SETS類似的東西,但是這一切都在一個結果,比如像:

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 

我已經添加了GROUPING_ID(),這使得它更易於和如果源是總行的原始摘要,則返回。

我總是想知道如何使用這樣的東西,因爲多個結果集使它難以處理。你不能將它傳遞給另一個存儲過程,你不能複製它直接粘貼到Excel(而不會混淆),傳遞給.net客戶端將是尷尬的。你如何使用以前的代碼?

HTH

3

A類與彙總的黑客,因爲計算通過是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 

結果

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

OR

可以使用下面

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 

輸出爲

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 
相關問題