4

作成している課金システムの4つのテーブルから情報を取得するクエリを作成しようとしています。私は次のテーブルを持っています:

テーブル請求書

InvoiceID (PK)
ClientID
Date
Status
...

テーブルクライアント

ClientID (PK)
ClientName
...

テーブルInvoiceItem

ItemID (PK)
InvoiceID
Amount
...

テーブル支払い

PaymentID (PK)
InvoiceID
Amount
...

請求書テーブルの情報にクライアント名、および請求書に関連付けられているすべての請求書アイテムと支払いの合計とともにアクセスできるクエリを作成する必要があります。

私は以下を試しました:

SELECT 
    Invoice.InvoiceID, 
    Invoice.`Date`, 
    Invoice.Terms, 
    Invoice.DateDue, 
    Invoice.Status, 
    Client.ClinicName, 
    SUM(InvoiceItem.Amount), 
    SUM(Payment.PaymentAmount)
FROM Invoice
JOIN (Client, InvoiceItem, Payment) ON
    (Client.ClientID=Invoice.ClientID AND
     InvoiceItem.InvoiceID=Invoice.InvoiceID AND 
     Payment.InvoiceID=Invoice.InvoiceID)

この種の作業では、SUM()に、合計を取得するために使用されるレコードの数を掛けます(つまり、2回の支払いがある場合-800,400-(800 + 400)* 2--2400になります)。結合の使用方法に何かがあると思います。正直なところ、複数のテーブルに結合を使用する必要はなく、常にGROUP BYを使用しますが、それを正しく機能させることができないようです。 。

さらに悪いことに、私は過去数年間、vb.net / MSSQLクライアントサイドプログラミングの世界に迷い込んでいるので、私のMySQLはかなり荒いです。

4

4 に答える 4

6

問題は、1つのクエリで一度に2つの独立したテーブルを集約できないことです。ただし、サブクエリを使用してそれを行うことができます。

SELECT Invoice.InvoiceID, Invoice.`Date`, Invoice.Terms, Invoice.DateDue, Invoice.Status, Client.ClinicName, InvoiceItemSum.SumOfAmount, PaymentSum.SumOfPaymentAmount
  FROM Invoice
  INNER JOIN Client ON Client.ClientID = Invoice.ClientID
  INNER JOIN (
    SELECT InvoiceID, SUM(Amount) AS SumOfAmount
      FROM InvoiceItem
      GROUP BY InvoiceID
  ) InvoiceItemSum ON InvoiceItemSum.InvoiceID = Invoice.InvoiceID
  INNER JOIN (
    SELECT InvoiceID, SUM(PaymentAmount) AS SumOfPaymentAmount
    FROM Payment
    GROUP BY InvoiceID
  ) PaymentSum ON PaymentSum.InvoiceID = Invoice.InvoiceID
于 2012-08-31T00:02:02.113 に答える
0

これを試して:

SELECT
    Invoice.InvoiceID,
    Invoice.`Date`,
    Invoice.Terms,
    Invoice.DateDue,
    Invoice.Status,
    Client.ClinicName,
    SUM(InvoiceItem.Amount),
    SUM(Payment.PaymentAmount)
FROM Invoice 
JOIN Client ON Client.ClientID=Invoice.ClientID
JOIN InvoiceItem ON InvoiceItem.InvoiceID=Invoice.InvoiceID
JOIN Payment ON Payment.InvoiceID=Invoice.InvoiceID
group by 1,2,3,4,5,6;

私はあなたの質問に対して2つのことをしました:

  1. 子テーブルごとに個別の結合を作成しました
  2. を追加しましたgroup by。これがないと、合計が正しく機能しません(fyi、他のすべてのデータベースでは、group byを省略すると、実際には構文エラーが発生します)
于 2012-08-30T23:58:28.137 に答える
0

これを試してみてください

SELECT  a.InvoiceID,
        a.`Date`,
        a.Terms,
        a.DateDue,
        a.Status,
        b.ClinicName,
        SUM(c.Amount),
        SUM(d.PaymentAmount)
FROM    Invoice a
            INNER JOIN Client b
                on a.ClientID = b.ClientID
            INNER JOIN InvoiceItem c
                ON c.InvoiceID = a.InvoiceID
            INNER JOIN JOIN Payment d
                ON d.InvoiceID = a.InvoiceID
GROUP BY    a.InvoiceID,
            a.`Date`,
            a.Terms,
            a.DateDue,
            a.Status,
            b.ClinicName

これについて詳しく教えていただけますか?

SUM()に、合計を取得するために使用されるレコードの数を掛けています(つまり、2回の支払いがある場合-800,400-(800 + 400)* 2--2400)

于 2012-08-31T00:01:28.817 に答える
0

「CROSSAPPLY」で達成することもできます

SELECT Invoice.InvoiceID, Invoice.`Date`, Invoice.Terms, Invoice.DateDue, Invoice.Status, Client.ClinicName, InvoiceItemSum.SumOfAmount, PaymentSum.SumOfPaymentAmount
  FROM Invoice
  INNER JOIN Client ON Client.ClientID = Invoice.ClientID
  CROSS APPLY ( SELECT ISNULL(SUM(Amount),0) AS SumOfAmount 
                                  FROM   InvoiceItem 
                                  WHERE  InvoiceID = Invoice.InvoiceID
                                ) InvoiceItemSum 
  CROSS APPLY ( SELECT ISNULL(SUM(PaymentAmount),0) AS SumOfPaymentAmount 
                                  FROM   Payment 
                                  WHERE  InvoiceID = Invoice.InvoiceID
                                ) PaymentSum 
于 2016-05-25T13:59:14.687 に答える