SQL 2008 VS 2012错误:关键字';计算';

SQL 2008 VS 2012错误:关键字';计算';,sql,sql-server,sql-server-2008,tsql,sql-server-2012,Sql,Sql Server,Sql Server 2008,Tsql,Sql Server 2012,我的朋友向我发送了他在Server2008中编写的命令,这些命令没有问题,但是我的从副本和过去的命令在2012中不起作用。有什么原因吗?代码如下: Use Kudler_Database SELECT AccountNumber, [Description], ShortDescription,Balance FROM Chart_of_Accounts ORDER BY left (AccountNumber, 2)

我的朋友向我发送了他在Server2008中编写的命令,这些命令没有问题,但是我的从副本和过去的命令在2012中不起作用。有什么原因吗?代码如下:

        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); 
以下是错误:

消息156,级别15,状态1,第6行关键字附近语法不正确 “计算”


COMPUTE
在SQL server 2012中不再可用,这就是为什么会出现该错误。见本页:

它说:

本主题介绍不再使用的数据库引擎功能 SQL Server 2012中提供:

*Transact-SQL语法| COMPUTE/COMPUTE BY*


您可以使用分组集创建类似的内容,但这些内容都包含在一个结果集中,例如:

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

是一种自Compute By以来的具有汇总功能的黑客

结果

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

您可以使用下面的

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

这是它谈论的第一个计算@BigDaddyCardona的可能重复,这是页面上说的,您可以在下面找到它:
Transact-SQL语法| compute/compute BY
好吧,我看到很晚了,很抱歉,但到时候如何修复计算?它不提供解决方案,只需使用汇总即可。我试过了,但没有成功。你会如何使用汇总重写这个?我对这个和SQL都是新手。@BigdadyCardona,请在下面找到我的答案。它可能会帮助你继续。很抱歉迟了答复
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