2011-01-26 6 views
2

私は、私が必要とするデータを私に与える次のクエリを持っていますが、CASE文の中のCash、Credit、Check列の合計が必要です。どうすればこれを達成できますか?可能であれば、この手順を使用したいと思います。列の合計を取得する方法

また、私にとって、このクエリはそれほど効率的ではないようです。誰もこれを改善することはできますか?変数を設定してCASE文の中で使うことができるはずですが、どうやってそれがどうなっているのかはわかりません。

SELECT 
t1.order_id, 
t3.price * SUM(t1.quantity) AS subtotal, 
(SUM(t1.discount) + t3.discount)/100 AS disc, 
t3.price * SUM(t1.quantity) * (t3.tax_state + t3.tax_fed) /100 AS tax, 
t3.price * SUM(t1.quantity) - (SUM(t1.discount) + t3.discount)/100 + t3.price * SUM(t1.quantity) * (t3.tax_state + t3.tax_fed) /100 AS total, 
CASE t2.payment_type WHEN 'Cash' THEN t3.price * SUM(t1.quantity) - (SUM(t1.discount) + t3.discount)/100 + t3.price * SUM(t1.quantity) * (t3.tax_state + t3.tax_fed) /100 ELSE 0.00 END AS cash, 
CASE t2.payment_type WHEN 'Card' THEN t3.price * SUM(t1.quantity) - (SUM(t1.discount) + t3.discount)/100 + t3.price * SUM(t1.quantity) * (t3.tax_state + t3.tax_fed) /100 ELSE 0.00 END AS card, 
CASE t2.payment_type WHEN 'Check' THEN t3.price * SUM(t1.quantity) - (SUM(t1.discount) + t3.discount)/100 + t3.price * SUM(t1.quantity) * (t3.tax_state + t3.tax_fed) /100 ELSE 0.00 END AS check 
FROM pos_item_order AS t1 
Join pos_order AS t2 ON t2.order_id = t1.order_id 
Join inv_item AS t3 ON t3.item_id = t1.item_id 
GROUP BY t1.order_id, t1.item_id 

編集:私は、私は「現金、クレジットの合計を必要と列を確認してください」と言うとき、私は列ごとにそれぞれの合計を意味します。

+0

「ロールアップあり」は必要な作業を行いますか? –

+0

ええと。私はそれ以前に使ったことがありません。私は今それについて少し読むでしょう。提案をありがとう、マーティン。 – Jim

+0

@Martin、それはロールアップで行を横に合計し、私は合計または垂直に合計が必要と思われる。 – Jim

答えて

1

陰惨なクエリですが、あなたが既に持っているものに、単純な志向の拡張子は、私はあなたが求めていると思う何を与える:

SELECT t1.order_id, 
     t3.price * SUM(t1.quantity) AS subtotal, 
     (SUM(t1.discount) + t3.discount)/100 AS disc, 
     t3.price * SUM(t1.quantity) * (t3.tax_state + t3.tax_fed) /100 AS tax, 
     t3.price * SUM(t1.quantity) - (SUM(t1.discount) + t3.discount)/100 + t3.price * SUM(t1.quantity) * (t3.tax_state + t3.tax_fed) /100 AS total, 
     CASE t2.payment_type WHEN 'Cash' 
     THEN t3.price * SUM(t1.quantity) - (SUM(t1.discount) + t3.discount)/100 + t3.price * SUM(t1.quantity) * (t3.tax_state + t3.tax_fed) /100 
     ELSE 0.00 END AS cash, 
     CASE t2.payment_type WHEN 'Card' 
     THEN t3.price * SUM(t1.quantity) - (SUM(t1.discount) + t3.discount)/100 + t3.price * SUM(t1.quantity) * (t3.tax_state + t3.tax_fed) /100 
     ELSE 0.00 END AS card, 
     CASE t2.payment_type WHEN 'Check' 
     THEN t3.price * SUM(t1.quantity) - (SUM(t1.discount) + t3.discount)/100 + t3.price * SUM(t1.quantity) * (t3.tax_state + t3.tax_fed) /100 
     ELSE 0.00 END AS check, 
     CASE WHEN t2.payment_type IN ('Cash', 'Card', 'Check') 
     THEN t3.price * SUM(t1.quantity) - (SUM(t1.discount) + t3.discount)/100 + t3.price * SUM(t1.quantity) * (t3.tax_state + t3.tax_fed) /100 ELSE 0.00 END AS cash_card_check 
    FROM pos_item_order AS t1 
    JOIN pos_order AS t2 ON t2.order_id = t1.order_id 
    JOIN inv_item AS t3 ON t3.item_id = t1.item_id 
GROUP BY t1.order_id, t1.item_i 

IN(...)表記は動作しない場合があります。そうでない場合は、代わりに3ウェイのOR条件を書き出すことができます。しかし、私は助けることはできませんが、あなたのクエリを構造化するためのより良い方法があると考える必要があります。

このクエリでは、お支払い方法を含む基本的な詳細が表示されます。一時テーブルに保存するか、DBMSがサポートしている場合はWITH句で名前付き部分式を使用します。

SELECT t1.order_id, 
     t2.payment_type, 
     t3.price * SUM(t1.quantity) AS subtotal, 
     (SUM(t1.discount) + t3.discount)/100 AS disc, 
     t3.price * SUM(t1.quantity) * (t3.tax_state + t3.tax_fed) /100 AS tax, 
     t3.price * SUM(t1.quantity) - (SUM(t1.discount) + t3.discount)/100 + t3.price * SUM(t1.quantity) * (t3.tax_state + t3.tax_fed) /100 AS total, 
     t3.price * SUM(t1.quantity) - (SUM(t1.discount) + t3.discount)/100 + t3.price * SUM(t1.quantity) * (t3.tax_state + t3.tax_fed) /100 AS payment 
    FROM pos_item_order AS t1 
    JOIN pos_order  AS t2 ON t2.order_id = t1.order_id 
    JOIN inv_item  AS t3 ON t3.item_id = t1.item_id 
GROUP BY t1.order_id, t1.item_i, t2.payment_type 

カードと小切手と現金を別々に集約することができます。

+0

これに感謝します。あなたが正しいです、私の質問は実際には見苦しいと私は同意する、それを構造化のより良い方法がある必要があります。私はあなたのクエリを実行し、それはうまく動作しますが、あなたは個々の行を集計しているようです。私が探しているのは、Check、Credit、Cashの列の合計です。それはあなたが行ったことでしたか? – Jim

+0

@Jim:クエリの2番目は中間結果です。現金、小切手、カード、および総額を計算するために再処理します。少なくとも、それは私の理論でした。私は、1つの注文に現金、小切手、クレジットカードの一部を支払っているかどうかは明らかではありません。あなたは私たちに十分なスキーマ情報を与えていないと確信しています。私は単一の注文が単一の支払方法を持つと仮定する傾向がありますが、私は間違っているかもしれません。 –

+0

ああ...あなたは今何をしているのか分かります。この努力に感謝します。ジョナサン、このクエリを書き直す必要があった場合、どうやったらいいでしょうか? – Jim

0

残念ながら別の式で派生列を使用することはできませんが、use a subqueryを使用して希望するものを達成することができます。

私の就寝時間を過ぎて、誰かがまだ私にそれを打つことがないなら、私はそれを明日行ってもらいますが、私はあなたに、

+0

Bradに感謝します。私は正しい方向にポイントを感謝します。 – Jim

関連する問題