2012-04-18 131 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

相关问题