2016-07-12 14 views
0

私の目標は、依然として残高残高のあるすべての注文を表示する(比較的効率的な)請求書の金額、すべての保管費の合計、支払った総額、各注文の合計金額を表示します。 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です。

+0

私は最後のwhere節で比較演算子を省略したと思います。 –

+0

各注文に「複数の請求書」がある場合は、請求書表はありませんか、または保管料は何ですか?私がこれを読むほど、スキーマを操作する良い方法があると思いますが、おそらく私は間違っています – MageeWorld

+0

@MageeWorldはい、ストレージテーブルは他の「請求書」テーブルです。私はタイトルを要約するように努めましたが、おそらくそれはかなり正確ではありませんでした。しかし、その考え方は、時間の経過とともに累積される請求書と保管料の両方を支払わなければならず、支払額と支払額(およびWHERE句の中でも同様)で説明されるべきであるということです。彼らは私のテーブルなので、もっと理にかなったらテーブルを変えることができます。 –

答えて

0

ご迷惑をおかけして申し訳ございません。私は保管台に質問しており、なぜ請求書が小さな部分に分割されていないのかについて質問しています。しかし、私は細部を知らないし、それは良いことかもしれません:)これは、あなたに少しわかりやすく類似の結果を与える動作するクエリです。

SELECT 
    * 
FROM 
(
    SELECT 
     orderid, 
     invoice, 
     storage, 
     totaldue=invoice+storage, 
     totalpaid=paid, 
     amountdue=(invoice+storage)-paid 
    FROM 
    (
      SELECT 
       orderid=orders.order_id, 
       invoice=orders.invoice, 
       storage= 
       (
        SELECT SUM(amount) FROM storage where order_id=orders.order_id 
       ), 
       paid=SUM(payments.amount) 
      FROM 
       orders 
       LEFT OUTER JOIN payments on payments.order_id=orders.order_id      
      GROUP BY 
       orders.order_id,orders.invoice 
    )AS DETAIL 
)AS SUMMARY 
WHERE 
    SUMMARY.amountdue>0 
+0

残念ながら、私はMySQLビューを作成しなければならないので、MySQLは "FROM"にサブクエリを置くことはできませんので、上記のソリューションを使用することはできません。また、あなたが言ったことに対処するために:あなたはスキーマの疑問について良い点を確認します。残念なことに、すべての「請求書」に対して1つのテーブルを持つこと、または個別の請求テーブルと個別のストレージテーブルを持つことに問題がある他のソフトウェア制約があります。それを言って、本当にありがとう! –

関連する問題