2016-07-24 13 views
0

Das Problem ist derjenige, der die Tabellen nicht ich gemacht hat. Dieses Problem basiert auf der Datenbankanpassung. Also Leute, ich brauche deine Hilfe.SUM mit mehreren Tabellen MySQL

Ich habe Tabellen, die SUM die der Items sein muss.

Ich benutze diesen Code die quantaties items-orderset_details Tisch zu bekommen.

SELECT 
    I.ItemId, I.Code, I.Item, I.Minimum, I.Maximum, 
    IFNULL 
    (
     (
      SELECT SUM(ROUND(h.Quantity)) 
      FROM orderset_details AS H 
      WHERE H.ItemId = I.ItemId 
     ) 
     , 0 
    ) as 'Balance' 
FROM items AS I 
GROUP BY I.ItemId 

OUTPUT

enter image description here

Aber es gibt Tabellen, die ein NEGATIVE Menge sein muss. Mein Code erhält nur alle Mengen für 1 Artikel zur Zeit.

SELECT 
    sts.TransferDate as 'Transaction Date' 
    , sts.TransNumber as 'Document Number' 
    , orderset_details.Quantity as 'Quantity' 
    , '' as 'Po Number' 
    , '' as 'Sales Invoice' 
    , orderset_details.Cost as 'Cost' 
    , orderset_details.SerialNumber as 'Serial Number' 
    , orderset_details.LotNumber as 'Lot Number' 
    , location.Location as 'Location' 
FROM sts 
LEFT JOIN orderset_details ON sts.OrdersetId = orderset_details.OrdersetId 
LEFT JOIN location ON location.LocationId = sts.LocationIdTo 
WHERE orderset_details.ItemId = '4786' 
UNION 
SELECT 
     drs.OrderDate 
    , drs.TransNumber 
    , orderset_details.Quantity 
    , drs.PONumber 
    , '' 
    , orderset_details.Cost 
    , orderset_details.SerialNumber 
    , orderset_details.LotNumber 
    , suppliers.Supplier 
FROM drs 
LEFT JOIN orderset_details ON drs.OrdersetId = orderset_details.OrdersetId 
LEFT JOIN suppliers ON suppliers.SupplierId = drs.SupplierId 
WHERE orderset_details.ItemId = '4786' 
UNION 
SELECT 
     stockadjustment.TransactionDate 
    , stockadjustment.TransactionId 
    , IF(reason.AddsToStock = '1', orderset_details.Quantity, 0 - orderset_details.Quantity) 
    , '' 
    , '' 
    , orderset_details.Cost 
    , orderset_details.SerialNumber 
    , orderset_details.LotNumber 
    , location.Location 
FROM stockadjustment 
LEFT JOIN reason ON reason.ReasonId = stockadjustment.ReasonId 
LEFT JOIN orderset_details ON stockadjustment.OrdersetId = orderset_details.OrdersetId 
LEFT JOIN location ON location.LocationId = stockadjustment.LocationId 
WHERE orderset_details.ItemId = '4786' 
UNION 
SELECT 
     issueslip.OrderDate 
    , issueslip.TransNumber 
    , IF(issueslip.OrdersetId = orderset_details.OrdersetId, 0 - orderset_details.Quantity, -1 * orderset_details.Quantity) 
    , '' 
    , '' 
    , orderset_details.Cost 
    , orderset_details.SerialNumber 
    , orderset_details.LotNumber 
    , customers.Customer  
FROM issueslip 
LEFT JOIN orderset_details ON issueslip.OrdersetId = orderset_details.OrdersetId 
LEFT JOIN customers ON customers.CustomerId = issueslip.CustomerId 
WHERE orderset_details.ItemId = '4786' 
UNION 
SELECT 
     invoice.OrderDate 
    , invoice.TransNumber 
    , IF(invoice.OrdersetId = orderset_details.OrdersetId, 0 - orderset_details.Quantity, -1 * orderset_details.Quantity) 
    , '' 
    , '' 
    , orderset_details.Cost 
    , orderset_details.SerialNumber 
    , orderset_details.LotNumber 
    , customers.Customer 
FROM invoice 
LEFT JOIN orderset_details ON invoice.OrdersetId = orderset_details.OrdersetId 
LEFT JOIN customers ON customers.CustomerId = invoice.CustomerId 
WHERE orderset_details.ItemId = '4786' 

ich nur von diesem Kodex müssen, ist für die Negative Quantity ConditionLIKEIF(reason.AddsToStock = '1', orderset_details.Quantity, 0 - orderset_details.Quantity) und 2 andere mehr Abfrage.

WIE KANN ICH DIESE FRAGE MIT MEINER ERSTEN FRAGE VERBINDEN?

Antwort

1

Man könnte so etwas tun:

SELECT I.ItemId, I.Code, I.Item, I.Minimum, I.Maximum, 
      COALESCE(SUM(ROUND(
       CASE SA.ReasonId WHEN R.ReasonId 
        THEN h.Quantity 
        ELSE -h.Quantity 
       END)), 0) as 'Balance' 
FROM  items AS I 
CROSS JOIN reason AS R 
LEFT JOIN orderset_details AS H 
     ON H.ItemId = I.ItemId 
LEFT JOIN stockadjustment AS SA 
     ON SA.OrdersetId = H.OrdersetId 
WHERE  R.AddsToStock = '1' 
GROUP BY I.ItemId 
+0

Okay, es krank versuchen :) –

+0

Die Abfrage dauert mehr als 300 Sekunden –

+0

Überprüfen Sie, ob Ihre Datenbank Primärschlüssel für jede der beteiligten Tabellen und Indizes für die ausländischen hat Schlüssel, die in der Abfrage verwendet werden. Ist das der Fall? Können Sie auch bestätigen, dass "OrdersetId" eine eindeutige Spalte in 'stockadjustment' ist? – trincot