5

インターンシップを開始したばかりで、いくつかの SQL を任されています。少しトリッキーです。どんな助けにも感謝します。ありがとう!

タスク:

「次のアラートを作成することは可能でしょうか。翌月が期限の未処理の販売注文が未処理の販売請求書と結合 (追加) されたときに、与信限度額を超えたすべての顧客を表示してください。」

私の提案したロジック:

  1. 最初にやりたいことは、各顧客 (SALES テーブル内) について、翌月のすべての販売注文を合計することです。

  2. 次に、各顧客のすべての未処理の請求書を合計します。つまり、各顧客が負っている合計金額を (INVOICES テーブルで) 計算します。

  3. 次に、対応する customer_id によって、1 と 2 の結果を一緒に追加します

  4. 次に、上記 3 の計算を比較して、各顧客の与信限度額よりも大きいかどうかを確認します。

3 の合計が与信限度を超える場合、これらの会社のみが生成されたテーブルに表示されます。結果のテーブルの理想的な形式は次のとおりです。

Cust_ID|Name|Sum_sales_orders (1.above)|Sum_open_invoices (2.above)| Total_orders&invoices
----------------------------------------------------------------------------
   1   |  A |  25000                   |  333                      | 25333 
       |    |                          |                           |

私がこれまでに持っているコードは

 SELECT arc.company, arc.credit_limit, 
     sum (ard.unit_price * ard.invoice_qty) as open_invoice_total, 
     sum (od.total_qty_ord * od.unit_price) as open_orders_total
 FROM iqms.arprepost_detail ard, iqms.arprepost arp, iqms.arcusto arc, iqms.ord_detail od, iqms.orders o
 WHERE ard.arprepost_id = arp.id 
     and arc.id = o.arcusto_id and o.id = od.orders_id
     and arp.arcusto_id = arc.id
  GROUP BY arc.company, arc.credit_limit

これは sum () 関数で正しい合計を計算していると思いますか? または私は間違っていますか?open_invoice_total と open_orders_total を追加するにはどうすればよいですか? 次に、それらを credit_limit と比較しますか?

私がやろうとしていることを皆さんが理解してくれることを願っています。事前に助けてくれてありがとう!:)

4

1 に答える 1

3

HAVING句を使用して、合計の合計が与信限度額を超えているかどうかを確認できます。また、読みやすくするために、WHERE 句の結合を INNER JOINS に置き換えました。

 SELECT arc.company, arc.credit_limit, 
       sum(ard.unit_price * ard.invoice_qty) as open_invoice_total, 
       sum(od.total_qty_ord * od.unit_price) as open_orders_total
 FROM iqms.arprepost_detail ard 
        INNER JOIN iqms.arprepost arp ON ard.arprepost_id = arp.id
        INNER JOIN iqms.arcusto arc ON arp.arcusto_id = arc.id
        INNER JOIN iqms.ord_detail od ON o.id = od.orders_id
        INNER JOIN iqms.orders o ON arc.id = o.arcusto_id 
  GROUP BY arc.company, arc.credit_limit
  HAVING sum(ard.unit_price * ard.invoice_qty) + sum(od.total_qty_ord * od.unit_price) > arc.credit_limit;

編集

Dems のコメントを明確にするために、 aliasesGROUP BYの指定を許可していないため、上記のクエリはとの合計を「繰り返し」ます。これは入れ子にすることで解消できますが、は で切り替えられることに注意してください。したがって、クエリの DRYer バージョンは次のとおりです。SELECTHAVINGHAVINGWHERE

SELECT company, credit_limit, open_invoice_total, open_orders_total
FROM
(
     SELECT arc.company, arc.credit_limit, 
           sum(ard.unit_price * ard.invoice_qty) as open_invoice_total, 
           sum(od.total_qty_ord * od.unit_price) as open_orders_total
     FROM iqms.arprepost_detail ard 
            INNER JOIN iqms.arprepost arp ON ard.arprepost_id = arp.id
            INNER JOIN iqms.arcusto arc ON arp.arcusto_id = arc.id
            INNER JOIN iqms.ord_detail od ON o.id = od.orders_id
            INNER JOIN iqms.orders o ON arc.id = o.arcusto_id 
      GROUP BY arc.company, arc.credit_limit
) AS nested
WHERE (open_invoice_total + open_orders_total) > arc.credit_limit;

また、必要に応じて、CTE を使用すると、これをより読みやすくすることができます。

;WITH nested AS
(
     SELECT arc.company, arc.credit_limit, 
           sum(ard.unit_price * ard.invoice_qty) as open_invoice_total, 
           sum(od.total_qty_ord * od.unit_price) as open_orders_total
     FROM iqms.arprepost_detail ard 
            INNER JOIN iqms.arprepost arp ON ard.arprepost_id = arp.id
            INNER JOIN iqms.arcusto arc ON arp.arcusto_id = arc.id
            INNER JOIN iqms.ord_detail od ON o.id = od.orders_id
            INNER JOIN iqms.orders o ON arc.id = o.arcusto_id 
      GROUP BY arc.company, arc.credit_limit
)
SELECT company, credit_limit, open_invoice_total, open_orders_total
  FROM nested
  WHERE (open_invoice_total + open_orders_total) > arc.credit_limit;
于 2012-11-23T11:23:47.100 に答える