3

スキーマといくつかのテスト データを使用してSQLFiddleを作成しました(ありがとう、Amadan !)。計算された列は、SQLFiddle では何らかの理由で機能しませんが、私の MYSQL Workbench ではうまくいきます。それらが正しく機能すると仮定します。

私は自分のクエリでここまで来ました:

SELECT DISTINCT o.orderid,i.invoiceid,i.subinvoicenumber,stockingorderid AS oistockingorderid,

IF(stockingorderid > 0, 0, po.purchaseorderid) AS purchaseorderid,subponumber,po.paidvia,dropshipfee,i.taxstate,

COALESCE(
    (SELECT mfrname 
        FROM cs_products.tblstockingorders so 
        WHERE so.stockingorderid=oistockingorderid),
    po.mfrname)
AS source,

(i.shipping + i.surcharge + 
    (SELECT SUM(additionalshipping * quantity) AS additionalshipping 
        FROM cs_products.tblorderitems 
        WHERE invoiceid=i.invoiceid)) 
AS shipping,

CAST(IF(o.paymentmethod=2, CONCAT('Check: ', i.checknumber),o.paymentmethod) AS CHAR) AS invoicepaidvia,

COALESCE(
    (SELECT (SUM(cost * quantity) * IF(so.mfrdiscount > 0, 1 - so.mfrdiscount, 1)) AS cost 
        FROM cs_products.tblorderitems oi 
        JOIN cs_products.tblallocations a ON oi.orderitemid=a.orderitemid 
        JOIN cs_products.tblstockingorders so ON a.stockingorderid=so.stockingorderid
        WHERE a.stockingorderid=oistockingorderid),
    (SELECT (SUM(cost * quantity) * IF(po.mfrdiscount > 0, 1 - po.mfrdiscount, 1)) AS cost 
        FROM cs_products.tblorderitems 
        WHERE purchaseorderid=po.purchaseorderid)) 
    AS grosscost,

(SELECT SUM(price * quantity)
    FROM cs_products.tblorderitems 
    WHERE invoiceid=i.invoiceid) 
AS grossprice

FROM cs_products.tblorders o 
    JOIN cs_products.tblinvoices i ON o.orderid=i.orderid
    #ordertype of 0 means the order came from the website
    LEFT JOIN cs_products.tblpurchaseorders po ON o.orderid=po.orderid AND IF(o.ordertype<>0, subinvoicenumber=subponumber, subinvoicenumber=0 AND subponumber>=0)
    LEFT JOIN cs_products.tblallocations a ON a.orderid=o.orderid

これで 95% 達成できました。ご覧のとおり、OrderId1287 の場合、stockingorderids を持つ 2 つのレコードが表示され、a を持つレコードは 1 つも表示されませんが、purchaseorderid発注書は 1287 に起因するとされています。欠落している行について私が期待しているのは、次のようなものです。

1287|276|0|NULL|194|0||0|0|'Quality Fabricators'|357.53|0|781.43|11917.70

繰り返しますが、計算された列について心配する必要はありません。レコードを表示したいだけです。ほんの少しでも欠けているような気がしますが、それが何かはわかりません。

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

UPDATE計算列が機能しない理由は、古い注文項目データが使用されたためです。機会があれば更新します。

4

1 に答える 1

2

NULL( ではなく) を使用して、それぞれ PO レコードと SO レコードのと0を表すことをお勧めします。stockingorderidpurchaseorderid

ALTER TABLE tblorderitems MODIFY purchaseorderid int(10) unsigned NULL;
UPDATE tblorderitems SET purchaseorderid = NULL WHERE purchaseorderid = 0;

次に、すべての ( order , stockingorder ) と ( order , purchaseorder ) のペアUNIONのセットを提供するサブクエリでクエリを結合できます。

  SELECT orderid, stockingorderid, NULL AS purchaseorderid FROM tblallocations
UNION ALL
  SELECT orderid, NULL AS stockingorderid, purchaseorderid FROM tblpurchaseorders

クエリは次のように簡略化できると思います。

SELECT   orderid, invoiceid, subinvoicenumber, purchaseorderid, subponumber,
         tblpurchaseorders.paidvia, dropshipfee, tblinvoices.taxstate,
         invoicedate, datepaid, stockingorderid,

         COALESCE(tblstockingorders.mfrname, tblpurchaseorders.mfrname) AS source,

         shipping + surcharge + SUM(quantity * additionalshipping) AS shipping,

         CASE paymentmethod
           WHEN 2 THEN CONCAT('Check: ', checknumber)
           ELSE CAST(paymentmethod AS CHAR)
         END AS InvoicePaidVia,

         (1-COALESCE(tblstockingorders.mfrdiscount, tblpurchaseorders.mfrdiscount))
           * SUM(quantity * cost) AS grosscost,

         SUM(quantity * price) AS grossprice

FROM     tblorders
  JOIN   tblinvoices          USING (orderid)
  JOIN (
          SELECT orderid, orderitemid, stockingorderid, NULL AS purchaseorderid
          FROM   tblallocations
        UNION ALL
          SELECT orderid, NULL, NULL, purchaseorderid
          FROM   tblpurchaseorders
       ) AS t                 USING (orderid)
  LEFT JOIN tblpurchaseorders USING (orderid,purchaseorderid)
  LEFT JOIN tblstockingorders USING (stockingorderid)
  LEFT JOIN tblorderitems     USING (orderid,orderitemid,invoiceid,purchaseorderid)
WHERE    ordertype = 0 OR subinvoicenumber = subponumber
GROUP BY orderid, invoiceid, subinvoicenumber, purchaseorderid, subponumber,
         tblpurchaseorders.paidvia, dropshipfee, tblinvoices.taxstate, datepaid,
         invoicedate, stockingorderid, shipping, surcharge, paymentmethod,
         tblstockingorders.mfrname, tblpurchaseorders.mfrname, checknumber,
         tblstockingorders.mfrdiscount, tblpurchaseorders.mfrdiscount

列への参照を削除して、sqlfiddleinvoicedateで参照してください (サンプル スキーマに存在しないため)。

于 2012-05-22T18:09:49.863 に答える