2015-09-25 46 views
0

我不知道标题应该如何。对标题的思考比写这个问题需要更多的时间。
给点
假设我有三个表:如何查询SUM连接表?

//table customers 
| ID | Name     | 
++++++++++++++++++++++++++++++++ 
| 194 | PT Comro Haneut  | 
| 195 | PT Kareueut Kameumeut | 

//table customer's savings 
| ID | IDCustomer | SavingsAmount | 
+++++++++++++++++++++++++++++++++++++ 
| 1 | 194  | 5000000 | 
| 2 | 195  |  250000 | 
| 3 | 195  | 2500000 | 
| 4 | 194  |  125000 | 
| 5 | 194  |  175000 | 

//table transactions 
| ID | IDCustomer | Amount  | 
+++++++++++++++++++++++++++++++++++++ 
| 1 | 195  | 1000000 | 
| 2 | 195  |  250000 | 
| 3 | 194  | 3500000 | 
| 4 | 194  |  300000 | 

目标
我要总结的储蓄金额和交易量,并且使结果在一行,像这样:

// expected result of the query 
| IDCustomer | Savings  | Transactions | Balance  | 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
| 194  | 5300000 | 4800000  | 500000  | 
| 195  | 2750000 | 1250000  | 1500000  | 

我试图建立由我自己的查询,但我总是失败。我得到的储蓄和交易总额增加了一倍。

任何人都可以帮忙吗?

回答

2

查询

select svg.id, Savings, Transactions, (Savings - Transactions) as Balance 
from 
(
    select c.id as id, sum(s.SavingsAmount) as Savings 
    from customers c 
    inner join savings s 
    on c.id=s.idcustomer 
    group by c.id 
) svg 
inner join 
(
    select c.id as id, sum(t.amount) as Transactions 
    from customers c 
    inner join transactions t 
    on c.id=t.idcustomer 
    group by c.id 
) trans 
on svg.id = trans.id 
; 

设置

create table customers 
(
    id integer primary key not null, 
    name varchar(23) not null 
); 

create table savings 
(
    id integer primary key not null, 
    IDCustomer integer not null, 
    SavingsAmount decimal(10, 2) not null, 
    foreign key (IDCustomer) references customers (id) 
); 

create table transactions 
(
    id integer primary key not null, 
    IDCustomer integer not null, 
    amount decimal(10, 2) not null, 
    foreign key (IDCustomer) references customers (id) 
); 

insert into customers 
(id, name) 
values 
(194 , 'PT Comro Haneut'  ), 
(195 , 'PT Kareueut Kameumeut') 
; 

insert into savings 
( id , IDCustomer , SavingsAmount) 
values 
( 1 , 194  , 5000000 ), 
( 2 , 195  ,  250000 ), 
( 3 , 195  , 2500000 ), 
( 4 , 194  ,  125000 ), 
( 5 , 194  ,  175000 ) 
; 

insert into transactions 
( id , IDCustomer , amount  ) 
values 
( 1 , 195  , 1000000 ), 
( 2 , 195  ,  250000 ), 
( 3 , 194  , 3500000 ), 
( 4 , 194  ,  300000 ) 
; 

输出

+-----+------------+--------------+------------+ 
| id | Savings | Transactions | Balance | 
+-----+------------+--------------+------------+ 
| 194 | 5300000.00 | 3800000.00 | 1500000.00 | 
| 195 | 2750000.00 | 1250000.00 | 1500000.00 | 
+-----+------------+--------------+------------+ 

sqlfiddle

+0

就是这样!子查询是答案:D –

0

看起来你并不需要从客户表中的任何具体数据,所以才来优化你可以使用结果

SELECT savings.IDCustomer, sum(SavingsAmount) as savings,sum(Amount) as amount, sum(SavingsAmount)-sum(Amount) as Balance 
FROM savings 
LEFT JOIN transactions 
ON savings.IDCustomer=transactions.IDCustomer 
group by savings.IDCustomer 
ORDER BY savings.IDCustomer; 
+0

是的,我只需要在客户表中的情况下,如果我要显示的客户名称。但是这个查询产生与另一个答案相同的结果。 –

+1

同意,结果相同。但是在某处查询执行时间可以通过避免查询中不需要的表连接来提高。 – Ranjana