2016-07-24 77 views
0

问题是谁使桌子不是我。这个问题基于数据库适配。所以,我需要你们的帮助。SUM与多个表MySQL

我有需要SUM的Quantity的项目。

我用这个代码来获得从itemsorderset_details表的Quantaties。

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 

输出

enter image description here

但也有需要是负数量表。我的代码在一次只能获得1项的所有数量。

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' 

我只是从这个代码需要的是为Negative Quantity ConditionLIKEIF(reason.AddsToStock = '1', orderset_details.Quantity, 0 - orderset_details.Quantity)和2等多个查询。

如何将这些查询结合到我的第一条查询上?

回答

1

你可以做这样的事情:

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

好生病试试吧:) –

+0

查询时间超过300秒 –

+0

检查您的数据库的每个在国外所涉及的表和索引的主键的详细在查询中使用的键。是这样吗?另外,您是否可以确认'OrdersetId'是'stockadjustment'中的唯一列? – trincot