2010-08-18 113 views
1

我有一个表中的格式如下数据:帮助创建一个SQL SELECT语句

Acct# Amount 
123  3.4 
123T  4.5 
124  2.3 
124T  4.5 
125  1.2 
125T  2.4 

如何创建它总计了账号为123 + 123T,并给出了下面的输出select语句:

123 7.9 
124 6.8 
125 3.6 
+2

哪'RDBMS'您使用的?你想如何分组账户:在第三个字符后面扔掉所有东西;扔掉所有非数字字符,不知何故? – Quassnoi 2010-08-18 15:04:43

回答

5

你不说SQL

的任何特定方言
SELECT LEFT(Acct#,3), SUM(Amount) 
FROM yourTable 
GROUP BY LEFT(Acct#,3) 

或者处理arbitrar Y轴长度账号

SELECT 
     CASE 
        WHEN Acct# LIKE '%T' 
        THEN SUBSTRING(Acct#,1,LEN(@Acct)-1) 
        ELSE Acct# 
     END, 
     SUM(Amount) 
FROM  yourTable 
GROUP BY 
     CASE 
        WHEN Acct# LIKE '%T' 
        THEN SUBSTRING(Acct#,1,LEN(@Acct)-1) 
        ELSE Acct# 
     END 

还是一个比较通用的方法,将处理任意映射可能是建立一个映射表,你可以再加入上。这里有很多关于需要应用的规则的缺失信息!

SELECT d.b, SUM(yt.Amount) 
FROM yourTable yt 
join (
     SELECT '123' as a, '123' as b UNION ALL 
     SELECT '123T' as a, '123' as b UNION ALL 
     SELECT '124' as a, '124' as b UNION ALL 
     SELECT '124T' as a, '124' as b UNION ALL 
     SELECT '125' as a, '125' as b UNION ALL 
     SELECT '125T' as a, '125' as b 
) d ON d.a = yt.Acct# 
GROUP BY d.b 
+1

问题作者请注意,您的帐号总是三位数字? – 2010-08-18 15:05:23

1

您也可以尝试

SELECT REPLACE([Acct#],'T', ''), SUM(Amount) 
FROM Acct 
GROUP BY REPLACE([Acct#],'T', '') 

测试数据

create table acct 
([acct#] varchar(10), 
amount decimal(10,2) 
) 

insert into acct([acct#], amount) values ('123', 3.4) 
insert into acct([acct#], amount) values ('123T', 4.5) 
insert into acct([acct#], amount) values ('124', 2.3) 
insert into acct([acct#], amount) values ('124T', 4.5) 
insert into acct([acct#], amount) values ('125', 1.2) 
insert into acct([acct#], amount) values ('125T', 2.4) 
+0

感谢您的快速回复家伙。我会试试看。 – 2010-08-18 15:18:24

1

我会做的是:

select b.acct#, (a.Amount + b.Amount) as Amount FROM yourTable as a inner join yourTable as b
ON a.acct# = b.acct# + 'T'

+0

这会访问表格两次,并假定将始终有一个对应的“T”记录加入。 +1虽然。 – 2010-08-18 15:39:10