2

我有一个balances包含以下列的表格:

bank | account | date | amount

我还有一个表accounts,它具有bankaccount作为其复合主键。

我想做一个类似以下伪代码的查询:

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

银行账户对列表由客户提供。我该怎么做呢?创建一个临时表并加入它?

我正在使用 Sybase

4

4 回答 4

3

如果您的应用程序中已知银行账户对,您只需编写:

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

如果银行账户对列表是子查询,则编写如下内容:

SELECT * FROM balances b LEFT JOIN bank_account_pairs p ON ...
WHERE b.bank = p.bank AND b.account = p.account AND ...
于 2009-03-12T02:09:21.497 回答
2

了解更多信息可能会有所帮助。

如果您有驱动特定银行和账户实体列表的标准,那么您应该加入这些表格。

你确实有一个银行表和一个帐户表,不是吗?

假设您在帐户表中有信息可以缩小要引用的特定帐户的范围,例如假设您的帐户表有一个 IsActive char(1) NOT NULL 字段,并且您想要非活动帐户的余额,您可以编写类似这样的内容:

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'

从设计的角度来看,您可能应该创建一个人工键来删除跨表的非标识数据的复制。这会给你这样的东西:

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
)

这允许编辑银行或帐户字段中的错误,而无需将这些更改级联到余额表以及稍微简单的查询。

SELECT date, sum( amount ) AS amount
FROM Balances b 
     INNER JOIN Accounts a 
     ON b.AccountId = a.AccountId
WHERE a.IsActive = 'N'
于 2009-03-12T02:06:02.083 回答
0

内部连接将强制执行银行+帐户组合,但您必须小心返回比预期更多的行,尤其是在求和时。

像下面这样的东西可能会起作用,尽管它取决于 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
于 2009-03-12T02:05:40.603 回答
0

如果你不想做一个临时表,一个解决方案是这样的:

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

如果您的应用程序可以处理它,最好的选择可能是这样的:

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)
于 2009-03-12T02:25:20.180 回答