2016-07-26 30 views
-1

我想顯示所有項目數量。但數量在不同的表具有多個表和IF MySQL的SUM項目和數量

輸出示例:

Item Quantity 
Item1 34 
Item2 10 
Item3 0 
........ 

我有一個代碼,可以盤點數量單項只。

SELECT SUM(ROUND(Quantity)) FROM(
SELECT 
COALESCE(SUM(od.Quantity),0) as 'Quantity' 
FROM sts as T1 
LEFT JOIN orderset_details as od ON T1.OrdersetId = od.OrdersetId 
WHERE od.ItemId = '4786' 
UNION ALL 
SELECT 
COALESCE(SUM(od.Quantity),0) as 'Quantity' 
FROM drs as T2 
LEFT JOIN orderset_details as od ON T2.OrdersetId = od.OrdersetId 
WHERE od.ItemId = '4786' 
UNION ALL 
SELECT 
COALESCE(SUM(IF(r.AddsToStock = '1', od.Quantity, 0 - od.Quantity)),0) as 'Quantity' 
FROM stockadjustment as T3 
LEFT JOIN reason as r ON r.ReasonId = T3.ReasonId 
LEFT JOIN orderset_details as od ON T3.OrdersetId = od.OrdersetId 
WHERE od.ItemId = '4786' 
UNION ALL 
SELECT 
COALESCE(SUM(IF(T4.OrdersetId = od.OrdersetId, 0 - od.Quantity, -1 * od.Quantity)),0) as 'Quantity' 
FROM issueslip as T4 
LEFT JOIN orderset_details as od ON T4.OrdersetId = od.OrdersetId 
WHERE od.ItemId = '4786' 
UNION ALL 
SELECT 
COALESCE(SUM(IF(T4.OrdersetId = od.OrdersetId, 0 - od.Quantity, -1 * od.Quantity)),0) as 'Quantity' 
FROM invoice as T4 
LEFT JOIN orderset_details as od ON T4.OrdersetId = od.OrdersetId 
WHERE od.ItemId = '4786') as t 

我如何能實現使用此代碼的項目?

表名items和id爲ItemId

+0

'LEFT JOIN x,其中x'是一樣的'INNER JOIN x' – Strawberry

+0

如果你喜歡,可以考慮下列行爲這個簡單的兩步過程:1.如果您還沒有這樣做,提供適當的CREATE和INSERT語句(和/或sqlfiddle),以便我們可以更容易地複製問題。 2.如果您還沒有這樣做,請提供與步驟1中提供的信息相對應的所需結果集。 – Strawberry

+0

@Strawberry對不起,我是MySQL的新手,雖然我已經使用了多年。這是我第一次遇到太多的連接。 –

回答

1
  1. 創建該存儲功能:

    DELIMITER // 
    
    CREATE FUNCTION getItemQty(
        _itemID INT(10) 
    ) 
    RETURNS INT 
    BEGIN 
    
    RETURN (SELECT 
         SUM(ROUND(Quantity)) 
        FROM (
         SELECT 
          COALESCE(SUM(od.Quantity),0) as Quantity 
         FROM sts as T1 
         LEFT JOIN orderset_details as od 
          ON T1.OrdersetId = od.OrdersetId 
         WHERE od.ItemId = _itemID 
         UNION ALL 
         SELECT 
          COALESCE(SUM(od.Quantity),0) as Quantity 
         FROM drs as T2 
         LEFT JOIN orderset_details as od 
          ON T2.OrdersetId = od.OrdersetId 
         WHERE od.ItemId = _itemID 
         UNION ALL 
         SELECT 
          COALESCE(
           SUM(
            IF(r.AddsToStock = '1', od.Quantity, 0 - od.Quantity) 
           ),0 
          ) as Quantity 
         FROM stockadjustment as T3 
         LEFT JOIN reason as r 
          ON r.ReasonId = T3.ReasonId 
         LEFT JOIN orderset_details as od 
          ON T3.OrdersetId = od.OrdersetId 
         WHERE od.ItemId = _itemID 
         UNION ALL 
         SELECT 
          COALESCE(
           SUM(
            IF(T4.OrdersetId = od.OrdersetId, 0 - od.Quantity, -1 * od.Quantity) 
           ),0 
          ) as Quantity 
         FROM issueslip as T4 
         LEFT JOIN orderset_details as od 
          ON T4.OrdersetId = od.OrdersetId 
         WHERE od.ItemId = _itemID 
         UNION ALL 
         SELECT 
          COALESCE(
           SUM(
            IF(T4.OrdersetId = od.OrdersetId, 0 - od.Quantity, -1 * od.Quantity) 
           ),0 
          ) as Quantity 
         FROM invoice as T4 
         LEFT JOIN orderset_details as od 
          ON T4.OrdersetId = od.OrdersetId 
         WHERE od.ItemId = _itemID 
        ) as t); 
    END// 
    
  2. 使用查詢來獲取數據。

    SELECT 
        ItemId, 
        getItemQty(ItemId) AS quantity 
    FROM items 
    
+0

我晚點試試,因爲我需要一些睡眠,但我認爲這是我正在尋找:)虐待後測試。謝謝你回答(y) –

+0

'#1054 - 'where子句'中的未知列'i.ItemId' –

+0

我看到,這是因爲我們有兩級子查詢,我們無法訪問外部查詢的數據。嘗試第二個查詢。如果它不起作用,我仍然可以嘗試。 –