5

私の友人は、サーバー 2008 で書いたコマンドを送ってくれましたが、問題なく動作しましたが、コピーと過去のコマンドは 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」付近の構文が正しくありません。

4

3 に答える 3

8

COMPUTESQL Server 2012では使用できなくなったため、このエラーが発生します。このページを参照してください:

それは言った:

このトピックでは、SQLServer2012で使用できなくなったデータベースエンジンの機能について説明します。

*Transact-SQL構文| COMPUTE / COMPUTE BY *

于 2012-09-19T08:59:31.013 に答える
3

Compute By が SQL Server 2012 で廃止されたため、RollUp を使用した一種のハック- (「SQL SERVER – COMPUTE BY の代わりに ROLL UP 句を使用する」を参照)

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

また

以下を使用できます

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
于 2012-09-21T02:51:53.917 に答える
1

GROUPING SETS で同様のものを作成できますが、すべてが 1 つの結果セットになります。たとえば、次のようなものです。

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

于 2012-09-19T15:22:18.530 に答える