我想为拥有客户的系统以及他们所做的收费和付款创建数据库架构。推荐的方法是什么,以便我以后只使用一个查询获得所有客户的总费用和付款清单?
单个查询应返回如下结果:
NAME | TotalCharges | TotalPayments
John 80 100
Nick 100 90
我正在考虑创建两个单独的表,一个用于收费,另一个用于付款。
CUSTOMERS
-ID
-NAME
CHARGES
-ID
-CUSTOMER_ID
-AMOUNT
PAYMENTS
-ID
-CUSTOMER_ID
-AMOUNT
另一种方法是为收费和付款创建一个表,每个表使用一列,如下所示:
CUSTOMERS
-ID
-NAME
CHARGES_AND_PAYMENTS
-ID
-CUSTOMER_ID
-CHARGE_AMOUNT
-PAYMENT_AMOUNT
另一种方法是使用TRANSACTION_TYPE标志将一个表用于收费和付款。 0->付款,1->收费,但如果我使用这种方法,我将无法使用一个查询获得客户的总费用和付款(或者我可以吗?)
CUSTOMERS
-ID
-NAME
CHARGES_AND_PAYMENTS
-ID
-CUSTOMER_ID
-TRANSACTION_TYPE (Flag: 0=Payment, 1=Charge)
-AMOUNT
哪种方法最好?
答案 0 :(得分:1)
您的第一种方法是正确的解决方案。
检索数据的SQL查询将是:
select
CUSTOMERS.ID, CUSTOMERS.Name,
sum( CHARGES.AMOUNT ) as total_CHARGES_amount,
sum( PAYMENTS.AMOUNT ) as total_PAYMENTS_amount
from
CUSTOMERS
left outer join
CHARGES on CUSTOMERS.ID = CHARGES.CUSTOMER_ID
left outer join
PAYMENTS on CUSTOMERS.ID = PAYMENTS.CUSTOMER_ID
group by
CUSTOMERS.ID, CUSTOMERS.Name
答案 1 :(得分:1)
对每个客户ID的费用和付款表格进行总结
select Customers.Name
, Customers.id
, ( select sum(Charges.Amount)
from Charges
where CustomerId = Customers.id )
, ( select sum(Payments.Amount)
from Payments
where CustomerId = Customers.id )
答案 2 :(得分:1)
在所有3种方法中,您可以使用一个查询获取数据,但我会建议第一种方法,因为您的数据将根据实体正确组织。您的单个查询将如下:
Select C.Name, SUM(CH.AMOUNT) AS CHARGES, SUM(P.AMOUNT) AS PAYMENTS
FROM CUSTOMERS C
LEFT JOIN CHARGES CH ON C.ID = CH.CUSTOMER_ID
LEFT JOIN PAYMENTS P ON C.ID = P.CUSTOMER_ID
WHERE C.ID = @CustomerId
GROUP BY C.Name
答案 3 :(得分:1)
您应该使用第一种方法,将费用和付款分成两个单独的组。
这些具有不同的特征。例如,付款方式可能包含付款方式,可能需要付费(可能在单独的表格中处理多笔费用的付款),是否为部分费用等等。
费用可能会有不同的信息,例如结算日期等。
正如其他人所说,您可以将多个表的结果合并到一个查询中。但是,这个事实与如何设计数据库模式的问题完全不同。