2012-04-18 132 views
1

我對SQL相當陌生,存在以下兩難困境。我有以下部分表格:SQL SUM基於一列的前兩個字符,一個表

Account Description ShortDescription Balance 
------------------------------------------------ 
100001 Blah, blah Blah, blah  28350.68 
100020  "   "    2537.35 
111000  "   "    86898.12 
111001  "   "    63943.63 
121000  "   "    55325.68 
121012  "   "    65264.35 
122000  "   "    94898.85

我需要SUM開始前兩位的所有帳戶的餘額。因此,前兩個餘額總結,下兩個總結,下三個總結等,然後我需要拿出這些數額,並創造一個總計。

結束表將包含所有列,SubTotal和GrandTotal。我找不出一個好辦法來做到這一點;我嘗試了OVER - PARTITION BY沒有成功(SELECT SUM(Balance)OVER(PARTITION BY Account)AS SubTotal)。任何幫助,將不勝感激。提前致謝。

+0

我認爲SQL並不是爲了處理這樣的需求而設計的。你最好用一些報告系統的王來生成小計。 – GolfWolf 2012-04-18 19:00:02

回答

2

這是總計和小計輸出表的一種方式:

-- select individual Rows 
    select Account, Description, ShortDescription, Balance from Accounts 
union 
    -- subtotals 
    select 
     substring(Account, 1, 2) as Account, 
     substring(Account, 1, 2) + ' Subtotal' as Description, 
     '' as ShortDescription, 
     sum(Balance) as Balance 
    from Accounts 
    group by substring(Account, 1, 2) 
union 
    -- grand total 
    select 
     '' as Account, 
     'Grand Total' as Description, 
     '' as ShortDescription, 
     sum(Balance) as Balance 
    from Accounts 
-- order all records to give the illusion of interlaced subtotals/grand total 
order by Account desc 

不過,我認爲最佳的解決辦法是有一個簡單的從表中選擇並使用報告工具(如SQL Server Reporting Services)處理總計/小計。

請不要在上述聲明中我認爲Account列的類型是char/varchar。如果聲明爲int或其他數字類型,則應添加適當的轉換/轉換轉換。 (union中的所有數據集必須具有相同的列數和相同的數據類型)

+0

謝謝w0lf!這很好!在現實世界中,我會使用報告工具;這就是他們的目標。但這是針對我的查詢培訓。我現在可以研究UNION;我以前從來沒有見過。非常感謝。 – user1341895 2012-04-18 19:38:21

+1

我很高興幫助。這裏是'UNION'的TSQL文檔:http://msdn.microsoft.com/en-us/library/ms180026.aspx – GolfWolf 2012-04-18 19:46:06

+0

感謝您的鏈接w0lf! – user1341895 2012-04-18 19:52:45

0

我認爲最初的問題是正確編寫分區有點困難,因爲語法有點痛苦。如果我已瞭解你正在尋找一個簡單的替代w0lf提供什麼(都在各行值和合計),這裏是什麼可能是一個更快的解決方案:

Select *, SUM(Balance) OVER (PARTITION BY substring(Account, 1, 2)) as Subtotal, 
    Sum(Balance) over(Partition by 1) as Total 
    from dbo.Accounts 

這給了每個原始的除小計列以外的列(*)和總列,在分區上使用總和。

我用下面的結構和您的數據,如果你得到任何錯誤,這可能是有幫助的:

CREATE TABLE dbo.Accounts (Account varchar(10), [Description] varchar(10), 
ShortDescription varchar(10), Balance money) GO 

    INSERT INTO Accounts (Account, Description, ShortDescription, Balance) VALUES 
    (100001, 'Blah', 'Blah2', 28350.68),(100020, 'Blah', 'Blah2', 2537.35), 
    (111000, 'Blah', 'Blah2', 86898.12),(111001, 'Blah', 'Blah2', 63943.63), 
    (121000, 'Blah', 'Blah2', 55325.68),(121012, 'Blah', 'Blah2', 65264.35), 
    (122000, 'Blah', 'Blah2', 94898.85) 

作爲附錄,如果帳戶存儲爲數字,你可以使用子(CAST(賬戶作爲varchar(max)),1,2))而不是substring(Account,1,2)。

+0

謝謝大衛!我認爲可能有一種方法來使用OVER - PARTITION BY,但它不起作用。雖然w0lf的格式更好,但爲了簡單起見,我仍然使用此代碼。我今天學到了兩件事 - 聯盟和基礎!再次感謝! – user1341895 2012-04-18 22:13:26

相關問題