2009-03-12 9 views
1

I ont une table balances avec les colonnes suivantes:SQL: filtre sur une combinaison de deux valeurs de colonne

bank | account | date | amount 

I ont également une table qui a accountsbank et account comme clé primaire composite.

Je veux faire une requête comme le pseudo-code suivant:

select date, sum(amount) as amount from balances where 
bank and account in (list of bank and account pairs) group by date 

La liste des paires compte bancaire est fourni par le client. Comment est-ce que je fais ceci? Créer une table temporaire et se joindre à elle?

J'utilise Sybase

Répondre

2

Si des paires de comptes bancaires est connu en vous vous application écrivez simplement:

(bank = 1 AND account = 2) OR (bank = 3 AND account = 4) OR ... 

Si la liste des paires de comptes bancaires est une sous-requête, écrire quelque chose comme ceci:

SELECT * FROM balances b LEFT JOIN bank_account_pairs p ON ... 
WHERE b.bank = p.bank AND b.account = p.account AND ... 
+0

Si je veux et condition au lieu de OU quelle sera la requête.Toute aide serait formidable – Akhil

0

Une jointure interne ferait respecter la combinaison bancaire + compte, mais vous devez faire attention à obtenir plus de lignes de retour que prévu, surtout lorsque vous faites des sommes.

Quelque chose comme ce qui suit pourrait fonctionner, même si cela dépendra si elle est prise en charge dans Sybase

select b.date, sum(b.amount) as amount 
from balances as b 
where exists (select 1 from backaccounts as ba where ba.bank = b.bank and ba.account = b.account) 
group by b.date 
2

Il peut être utile d'avoir un peu plus d'informations.

Si vous avez des critères qui déterminent votre liste d'entités bancaires et de comptes, vous devriez vous joindre à ces tables.

Vous avez une table de banque et une table de compte n'est-ce pas? En supposant que vous ayez les informations dans la table des comptes qui affinent les comptes spécifiques que vous souhaitez référencer, par exemple, supposons que votre table Comptes possède un champ IsActive char (1) NOT NULL et que vous voulez les soldes pour les comptes inactifs. écrire quelque chose comme ceci:

SELECT date, sum(amount) AS amount 
FROM Balances b 
    INNER JOIN Accounts a 
    ON b.Bank = a.Bank AND b.Account = a.Account 
WHERE a.IsActive = 'N' 

du point de vue de la conception de votre devrait probablement créé une clé artificielle pour supprimer la réplication des données non-identification à travers des tables. Cela vous donne quelque chose comme ceci:

CREATE TABLE Accounts ( 
    AccountId int identity(1,1) NOT NULL, 
    Bank nvarchar(15) NOT NULL, 
    Account nvarchar(15) NOT NULL 
) 

CREATE TABLE Balances ( 
    AccountId int, 
    Date datetime, 
    Amount money 
) 

Cela permet à des erreurs dans la Banque ou des champs de compte à modifier sans avoir à cascade ces changements à la table des soldes ainsi qu'une requête un peu plus simple.

SELECT date, sum(amount) AS amount 
FROM Balances b 
    INNER JOIN Accounts a 
    ON b.AccountId = a.AccountId 
WHERE a.IsActive = 'N' 
+0

Bon point.Je viens de mettre à jour ma question pour inclure cette information. –

+0

Merci pour votre réponse. Dans ce cas précis, le client envoie une liste de paires de comptes bancaires. Croyez-moi, si j'avais le contrôle du schéma, j'utiliserais des clés artificielles! –

0

Si vous ne vouliez pas faire de table temporaire, une solution serait la suivante:

select bank, account, sum(amount) 
from balances, 
(select 'XXX' as bank, 13232 as account 
    union all 
select 'YYY' as bank, 138232 as account 
    union all 
select 'ZZZ' as bank, 183823 as account) banks 
where balances.bank = banks.bank 
    and balances.account = banks.account 

Si votre application peut gérer, la meilleure option est probablement comme ceci:

select bank, account, sum(amount) 
from balances 
where (bank = 'XXX' and account = 123i832) 
    or (bank = 'YYY' and account = 28323) 
    or (bank = 'ZZZ' and account = 2839283) 
Questions connexes