1

顧客とその料金と支払いを保持するシステムのデータベース スキーマを作成したいと考えています。1 つのクエリだけを使用して、すべての顧客の合計料金と支払いのリストを後で取得できるようにするための推奨されるアプローチは何ですか?

単一のクエリは、次のような結果を返す必要があります。

NAME  |  TotalCharges  |  TotalPayments
John          80              100
Nick         100               90

料金用と支払い用の 2 つの別個のテーブルを作成することを考えています。

CUSTOMERS
-ID
-NAME

CHARGES
-ID
-CUSTOMER_ID
-AMOUNT

PAYMENTS
-ID
-CUSTOMER_ID
-AMOUNT

もう 1 つの方法は、次のように、料金と支払いの両方に対して 1 つのテーブルを作成し、それぞれに 1 つの列を使用することです。

CUSTOMERS
-ID
-NAME

CHARGES_AND_PAYMENTS
-ID
-CUSTOMER_ID
-CHARGE_AMOUNT
-PAYMENT_AMOUNT

もう 1 つの方法は、TRANSACTION_TYPE フラグを使用して、料金と支払いの両方に 1 つのテーブルを使用することです。0->Payment、1->Charge ですが、このアプローチを使用すると、1 つのクエリで顧客の料金と支払いの合計を取得することはできません (または取得できますか?)。

CUSTOMERS
-ID
-NAME

CHARGES_AND_PAYMENTS
-ID
-CUSTOMER_ID
-TRANSACTION_TYPE  (Flag: 0=Payment, 1=Charge)
-AMOUNT

最適なアプローチはどれですか?

4

4 に答える 4

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 )
于 2012-06-01T13:58:19.847 に答える
1

3 つの方法すべてで、1 回のクエリでデータを取得できますが、最初の方法をお勧めします。これは、データがエンティティに従って適切に編成されるためです。そして、単一のクエリは次のようになります。

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
于 2012-06-01T14:00:54.867 に答える
1

最初のアプローチを使用して、料金と支払いを 2 つの別々のグループに分割する必要があります。

これらには異なる特徴があります。たとえば、支払いには、支払い方法、適用する料金 (複数の料金の支払いを処理するために別のテーブルにある場合があります)、部分料金かどうかなどがあります。

料金には、請求日など、さまざまな情報が含まれている可能性があります。

他の人が指摘したように、複数のテーブルの結果を 1 つのクエリに組み合わせることができます。ただし、その事実は、データベース スキーマをどのように設計するかという問題とはまったく別のものです。

于 2012-06-01T14:45:43.150 に答える
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
于 2012-06-01T13:57:37.050 に答える