2012-05-22 2 views
3

Я создал SQLFiddle (спасибо, Amadan!) С моей схемой и некоторыми тестовыми данными. Вычисляемые столбцы почему-то не работают в SQLFiddle, но в моем MYSQL Workbench они отлично работают. Предположим, что они работают правильно.Комплекс MySQL Query, я настолько близок, что смогу его обмануть

Я получил это далеко с моим запросом:

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% пути. Как вы можете видеть, для OrderId 1287, он показывает две записи с stockingorderid с и ни с purchaseorderid, даже если заказ на поставку был приписан 1287. То, что я ожидал увидеть пропавшей подряд не что-то вроде:

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

Опять же, не беспокойтесь о вычисленных столбцах, я просто хочу, чтобы запись появилась. Я чувствую, что мне не хватает наименьшей вещи, но я не знаю, что это.

Спасибо!

UPDATE Причина, по которой расчетные столбцы не работают, объясняется тем, что использовались данные элемента старого заказа. Я обновлю это, когда у меня появится такая возможность.

+0

Используйте IFNULL ((выберите blah blah), (выберите blah blah)), второй по умолчанию, если не найден с первого 2-го запуска, я, возможно, не смогу понять, но я думаю, это то, что вы ищете –

+1

@ Amadan благодарит за то, что я показал мне SQLFiddle. Я много использую JSFiddle и ReFiddle, но я понятия не имел, что SQLFiddle существует! Я создаю SQLFiddle прямо сейчас и обновляю свой пост. Благодаря! – Jason

+0

@ Lieven не могли бы вы поместить свое решение в ответ? – Jason

ответ

2

Я хотел бы предложить, что вы используете NULL (а не 0) представлять stockingorderid и purchaseorderid РО и SO записи соответственно:

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

Вы можете присоединиться запрос с UNION подзапроса, который обеспечивает Множество всех (заказ, stockingorder) и (заказ, PurchaseOrder) пар:

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 

Посмотрите на sqlfiddle, со ссылками на invoicedate колонки удалена (потому что нет в вашей схеме выборки).

+0

!!! это супер близко. единственное, что неверно в результирующем наборе, - это 4 записи для 1289, где должно быть только 2, когда в заказе существует несколько счетов-фактур, их подсбайты должны соответствовать соответствующему поднабору PO. однако это определенно заставляет меня двигаться в правильном направлении (ключевое слово «ИСПОЛЬЗОВАНИЕ» - это потрясающе, не знаю об этом!) – Jason

+0

на стороне записки, спасибо за переписывание моего запроса. Я относительно самоучка в области SQL, и я изучаю LOT просто, просматривая ваш запрос! – Jason

+1

@ Джейсон: См. Мой пересмотренный ответ. И снова обратите внимание, это удовольствие :) По большей части мы все начали учиться в какой-то момент, поэтому здорово также помогать другим (плюс мне просто нравится вызов). Руководство MySQL очень полезно (и довольно доступно), если у вас есть время сесть и просмотреть его! – eggyal

Смежные вопросы