私の目標は、依然として残高残高のあるすべての注文を表示する(比較的効率的な)請求書の金額、すべての保管費の合計、支払った総額、各注文の合計金額を表示します。 2つの「請求書」は、注文テーブルからの元の請求書金額と、次にストレージテーブルからのすべての保管金額(手数料)の合計です。MySQL:各注文(複数の支払い)に複数の請求テーブルがある場合に残高がある注文のみを表示する
請求テーブルの請求書の金額、支払いテーブルの特定の注文のすべての支払い、および特定の注文の追加のすべてのストレージ料金がストレージテーブルにあります(支払いテーブルと保管テーブルは、 order_idフィールド)。
は、以下の例のデータと私のスキーマです(と、ここでそれが役に立つ場合SQL fiddleです):私はそんなに繰り返して、それが5つのサブクエリの合計のように見えるので、
が
CREATE TABLE orders
(
order_id int NOT NULL AUTO_INCREMENT,
invoice decimal(10,2),
PRIMARY KEY (order_id)
);
CREATE TABLE payments
(
payments_id int NOT NULL AUTO_INCREMENT,
order_id int,
amount decimal(10,2),
PRIMARY KEY (payments_id)
);
CREATE TABLE storage
(
storage_id int NOT NULL AUTO_INCREMENT,
order_id int,
amount decimal(10,2),
PRIMARY KEY (storage_id)
);
INSERT INTO orders (invoice)
VALUES ('250'), (NULL), ('150'), ('175.00'), ('175.00'), (NULL);
INSERT INTO payments (order_id, amount)
VALUES ('1', '50'), ('3', '50'), ('1', '100'), ('1', '150'), ('4', '100'), ('4', '25'), ('3', '50');
INSERT INTO storage (order_id, amount)
VALUES ('1', '50'), ('4', '25');
次のクエリではなく、作品、
CREATE VIEW accounts_receivable AS
SELECT
orders.order_id AS orderid,
orders.invoice,
(SELECT sum(amount) from storage WHERE storage.order_id = orders.order_id) AS storagebill,
coalesce(sum(payments.amount), 0) AS paid,
coalesce(orders.invoice, 0) + (SELECT coalesce(SUM(storage.amount), 0) FROM storage WHERE storage.order_id = orders.order_id) - (SELECT coalesce(sum(payments.amount), 0) FROM payments WHERE orders.order_id = payments.order_id) AS due
FROM orders
LEFT JOIN payments on payments.order_id = orders.order_id
WHERE
(coalesce(orders.invoice, 0) + (SELECT coalesce(SUM(storage.amount), 0) FROM storage WHERE storage.order_id = orders.order_id) - (SELECT coalesce(sum(payments.amount), 0) FROM payments WHERE orders.order_id = payments.order_id)) > 0
GROUP BY orders.order_id
は、より効率的な方法で、このデータを取得する方法があります:私がこの作業を取得するための効率的な方法ではありません推測していますか?私はここにデータを結合するいくつかの異なる方法があると推測していますが、私は無駄に実験しました(そして答えを探しました)。私は比較的新しいSQLです。
私は最後のwhere節で比較演算子を省略したと思います。 –
各注文に「複数の請求書」がある場合は、請求書表はありませんか、または保管料は何ですか?私がこれを読むほど、スキーマを操作する良い方法があると思いますが、おそらく私は間違っています – MageeWorld
@MageeWorldはい、ストレージテーブルは他の「請求書」テーブルです。私はタイトルを要約するように努めましたが、おそらくそれはかなり正確ではありませんでした。しかし、その考え方は、時間の経過とともに累積される請求書と保管料の両方を支払わなければならず、支払額と支払額(およびWHERE句の中でも同様)で説明されるべきであるということです。彼らは私のテーブルなので、もっと理にかなったらテーブルを変えることができます。 –