2012-09-19 201 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 
相关问题