2010-08-18 6 views
1

J'ai données dans le format suivant dans un tableau:aide pour créer une instruction SQL SELECT

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

Comment puis-je créer une instruction select où il totalise le numéro de compte 123 + 123T et donne la sortie suivante :

123 7.9 
124 6.8 
125 3.6 
+2

qui 'RDBMS' utilisez-vous? Comment voulez-vous regrouper les comptes: jetez tout après le troisième personnage; jeter tous les caractères non numériques, d'une autre manière? – Quassnoi

Répondre

5

Vous ne dites pas dialecte particulier de SQL

SELECT LEFT(Acct#,3), SUM(Amount) 
FROM yourTable 
GROUP BY LEFT(Acct#,3) 

Ou pour gérer arbitrar y longueur des numéros de compte

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 

Ou une approche plus générique qui traitera les correspondances arbitraires pourrait être de construire une table de correspondance que vous pouvez rejoindre sur. Il y a beaucoup d'informations manquantes ici concernant les règles qui doivent être appliquées!

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

Note pour l'auteur de la question, vos numéros de compte auront-ils toujours trois chiffres? –

1

Vous pouvez également essayer

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

données de test

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

Merci pour la réponse rapide les gars. Je vais l'essayer. –

1

je l'aurais fait:

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

Cela accède à la table deux fois et suppose qu'il y aura toujours un enregistrement 'T' correspondant sur lequel se connecter. +1 cependant. –