19

以下のDB設計を継承しています。テーブルは次のとおりです。

customers
---------
customerid  
customernumber

invoices
--------
invoiceid  
amount

invoicepayments
---------------
invoicepaymentid  
invoiceid  
paymentid

payments
--------
paymentid  
customerid  
amount

私のクエリは、特定の customernumber について、invoiceid、請求額 (invoices テーブル内)、および請求額 (請求額から請求書に対して行われた支払いを差し引いたもの) を返す必要があります。顧客は複数の請求書を持っている場合があります。

次のクエリでは、請求書に対して複数の支払いが行われると、重複したレコードが返されます。

SELECT i.invoiceid, i.amount, i.amount - p.amount AS amountdue
FROM invoices i
LEFT JOIN invoicepayments ip ON i.invoiceid = ip.invoiceid
LEFT JOIN payments p ON ip.paymentid = p.paymentid
LEFT JOIN customers c ON p.customerid = c.customerid
WHERE c.customernumber = '100'

どうすればこれを解決できますか?

4

5 に答える 5

18

私はあなたを手に入れたかどうか確信が持てませんが、これはあなたが探しているものかもしれません:

SELECT i.invoiceid, sum(case when i.amount is not null then i.amount else 0 end), sum(case when i.amount is not null then i.amount else 0 end) - sum(case when p.amount is not null then p.amount else 0 end) AS amountdue
FROM invoices i
LEFT JOIN invoicepayments ip ON i.invoiceid = ip.invoiceid
LEFT JOIN payments p ON ip.paymentid = p.paymentid
LEFT JOIN customers c ON p.customerid = c.customerid
WHERE c.customernumber = '100'
GROUP BY i.invoiceid

これにより、請求書ごとに複数の支払い行がある場合に合計金額が得られます

于 2009-08-06T23:44:37.057 に答える
9

返信ありがとうございます!

Saggi Malachiは、残念ながら、複数の支払いがある場合に請求額を合計します。$18と$12の$39の請求書に2回の支払いがあるとします。したがって、次のような結果になるのではなく、次のようになります。

1   39.00   9.00

最終的には次のようになります。

1   78.00   48.00

Charles Bretanaは、クエリを可能な限り単純なクエリに切り詰める過程で、顧客と請求書の間のリンクを提供する追加のテーブルcustomerinvoicesを(ばかげて)省略しました。これは、支払いが行われていない請求書を表示するために使用できます。

多くの苦労の末、次のクエリは必要なものを返すと思います。

SELECT DISTINCT i.invoiceid, i.amount, ISNULL(i.amount - p.amount, i.amount) AS amountdue
FROM invoices i
LEFT JOIN invoicepayments ip ON i.invoiceid = ip.invoiceid
LEFT JOIN customerinvoices ci ON i.invoiceid = ci.invoiceid
LEFT JOIN (
  SELECT invoiceid, SUM(p.amount) amount
  FROM invoicepayments ip 
  LEFT JOIN payments p ON ip.paymentid = p.paymentid
  GROUP BY ip.invoiceid
) p
ON p.invoiceid = ip.invoiceid
LEFT JOIN payments p2 ON ip.paymentid = p2.paymentid
LEFT JOIN customers c ON ci.customerid = c.customerid
WHERE c.customernumber='100'

同意しますか?

于 2009-08-07T18:13:54.353 に答える
4

同じテーブルからさまざまな集計値を取得したい人のためのヒントがあります。

ユーザーのいるテーブルとユーザーが獲得したポイントのあるテーブルがあるとしましょう。したがって、それらの間の接続は1:N(1人のユーザー、多くのポイントレコード)です。

ここで、「ポイント」テーブルに、ユーザーがポイントを取得したもの(ログイン、バナーのクリックなど)に関する情報も保存します。SUM(points)そして、 ANDの順に並べられたすべてのユーザーを一覧表示したいと思いますSUM(points WHERE type = x)。つまり、ユーザーが持っているすべてのポイントで並べ替えられ、次にユーザーが特定のアクション(ログインなど)で取得したポイントで並べ替えられます。

SQLは次のようになります。

SELECT SUM(points.points) AS points_all, SUM(points.points * (points.type = 7)) AS points_login
FROM user
LEFT JOIN points ON user.id = points.user_id
GROUP BY user.id

これの美しさはSUM(points.points * (points.type = 7))、内側の括弧が0または1のいずれかに評価され、必要なポイントのタイプに等しいかどうかに応じて、指定されたポイント値に0または1を掛けることにあります。

于 2010-06-22T15:54:40.503 に答える