1

次のクエリを使用して、売上高を取得しています。問題は、間違ったデータを返すことです。

3 つのテーブルを結合していtbl_orders tbl_orderitems tbl_paymentます。tbl_ordersテーブルには概要情報、注文tbl_orderitemsされた商品、およびtbl_payment注文に関する支払い情報が保持されます。各注文に対して複数の支払いを行うことができます。

アイテムの合計と、sum(mon_orditems_pprice)販売されたアイテムの量を取得しようとしていますcount(uid_orderitems)

特定の注文番号に対して次のクエリを実行すると、注文アイテムが 1 つあることがわかっています。カウント 2 と 2 つの項目の合計を返します。

Item                       ProdTotal    ProdCount
Westvale Climbing Frame    1198         2

この注文には、テーブルに 2 つの支払いレコードが保持されているためtbl_payment、二重カウントが発生しています。支払いテーブルの結合を削除すると、正しい数値が報告されます。または、単一の支払いを持つ注文を選択すると、同様に機能します。私は何かが足りないのですか、私は疲れています!!!??

SELECT 
  txt_orditems_pname,
  SUM(mon_orditems_pprice) AS prodTotal,
  COUNT(uid_orderitems) AS prodCount
FROM dbo.tbl_orders
  INNER JOIN dbo.tbl_orderitems ON (dbo.tbl_orders.uid_orders = dbo.tbl_orderitems.uid_orditems_orderid)
  INNER JOIN dbo.tbl_payment ON (dbo.tbl_orders.uid_orders = dbo.tbl_payment.uid_pay_orderid)
WHERE
  uid_orditems_orderid = 61571
GROUP BY
  dbo.tbl_orderitems.txt_orditems_pname
ORDER BY
  dbo.tbl_orderitems.txt_orditems_pname

助言がありますか?

ありがとうございました。

表の列のドリルダウン

dbo.tbl_payment.bit_pay_paid (1/0) Has this payment been paid, yes no
dbo.tbl_orders.bit_order_archive (1/0) Is this order archived, yes no
dbo.tbl_orders.uid_order_webid (integer) Web Shop's ID
dbo.tbl_orders.bit_order_preorder (1/0) Is this a pre-order, yes no
YEAR(dbo.tbl_orders.dte_order_stamp) (2012) Sales year
dbo.tbl_orders.txt_order_status (varchar) Is the order dispatched, awaiting delivery
dbo.tbl_orderitems.uid_orditems_pcatid (integer) Product category ID
4

1 に答える 1

1

mon_orditems_ppriceこれは通常の動作です。グループ化句を削除すると、結合後に実際には 2 つの行があり、どちらも 599 であるため、SUM正しいことがわかります。結合されたテーブルに複数の一致がある場合、出力行全体が複数になり、合計される (または他の方法でカウントまたは集計される) データも複数回合計されます。これを試して:

SELECT      txt_orditems_pname,
            SUM(mon_orditems_pprice) AS prodTotal,
            COUNT(uid_orderitems) AS prodCount
FROM        dbo.tbl_orders
INNER JOIN  dbo.tbl_orderitems ON (dbo.tbl_orders.uid_orders = dbo.tbl_orderitems.uid_orditems_orderid)
INNER JOIN  
(
    SELECT  x.uid_pay_orderid
    FROM    dbo.tbl_payment x
    GROUP   BY x.uid_pay_orderid
) AS payments ON (dbo.tbl_orders.uid_orders = payments.uid_pay_orderid)

WHERE
  uid_orditems_orderid = 61571
GROUP BY
  dbo.tbl_orderitems.txt_orditems_pname
ORDER BY
  dbo.tbl_orderitems.txt_orditems_pname

どのデータを使用しているかわかりませんがtbl_payment、実際に SELECT リストからの列はありますtbl_paymentか? なぜtbl_payment加入されているのですか?

于 2012-11-28T15:04:32.830 に答える