2012-09-19 64 views
5

Bạn tôi gửi cho tôi các lệnh mà anh ấy đã viết trong máy chủ 2008 và họ đã làm việc không có vấn đề gì, tuy nhiên từ bản sao và quá khứ không hoạt động vào năm 2012. có lý do gì không? Đây là mã:SQL 2008 VS 2012 Lỗi: Cú pháp không chính xác gần từ khóa '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); 

đây là lỗi:

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

+0

đó là tính toán đầu tiên nó được nói về – BigDaddyCardona

+0

trùng lặp có thể xảy ra của [Không thể thực hiện một tuyên bố tính] (http://stackoverflow.com/questions/ 12338697/cant-execute-a-compute-statement) –

Trả lời

8

COMPUTE không còn có sẵn trong SQL server 2012, đó là lý do tại sao bạn đang nhận được lỗi đó. Xem trang này:

Nó nói rằng:

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

*Transact-SQL syntax | COMPUTE/COMPUTE BY *

+0

Điều gì không còn khả dụng? – BigDaddyCardona

+1

@BigDaddyCardona, Đó là những gì trang nói, bạn có thể tìm thấy nó theo: 'Cú pháp Transact-SQL | COMPUTE/COMPUTE BY ' –

+0

Ok tôi đã thấy rằng tôi rất tiếc nhưng bạn sẽ khắc phục COMPUTE BY bằng cách nào? Nó không đưa ra một giải pháp chỉ sử dụng rollup. Tôi đã cố gắng mà không làm việc. – BigDaddyCardona

1

Bạn có thể tạo một cái gì đó tương tự với SETS GROUPING nhưng tất cả đi kèm trong một resultset, ví dụ như một cái gì đó như:

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 

Tôi đã thêm GROUPING_ID() giúp dễ dàng hơn để wo rk ra nếu nguồn là một bản gốc, tóm tắt cho tổng hàng.

Tôi luôn tự hỏi làm thế nào bạn sẽ tiêu thụ một cái gì đó như thế vì nhiều kết quả làm cho nó khó xử lý. Bạn không thể chuyển nó sang một thủ tục được lưu trữ khác, bạn không thể sao chép nó trực tiếp vào Excel (mà không có rối tung xung quanh), chuyển tới một máy khách .net sẽ rất khó xử. Bạn đã tiêu thụ mã trước đó như thế nào?

HTH

3

Một loại hack với RollUp từ Tính Bằng là 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 

quả

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

HOẶC

bạn có thể sử dụng dưới đây

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 

Kết quả là

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 
Các vấn đề liên quan