2016-07-28 4 views
1

私のitemsテーブルのすべてのレコードを表示したい。しかし、いくつかの量は負の値である必要があります。複数のテーブルを持つMySQLストアドプロシージャ

BEGIN 
    SET @ItemId1 = (SELECT ItemId FROM items); 

    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 = @ItemId1 
     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 = @ItemId1 
     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 = @ItemId1 
     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 = @ItemId1 
     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 = @ItemId1 
    ) as t; 
END 

このコードにはエラーMySQL said: #1242 -Subquery returns more than 1 rowがあります。

すべてのアイテムの数量をすべて表示します。それで私はなぜ@ ItemId1を持っているのですか?ItemId from items。どうやってやるの?

+0

最初の行を確認してください。複数の値を選択しています –

+0

auto_incrementの値が重複しないようにします –

+0

はい、スカラーに複数の値を割り当てようとしています。 –

答えて

1

ItemIdでグループ化する必要があります。 お試しください

SELECT 
    ItemId, SUM(ROUND(Quantity)) 
FROM (
    SELECT 
     od.ItemId, 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 = @ItemId1 
    GROUP BY od.ItemId 
    UNION ALL 
    SELECT 
     od.ItemId, 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 = @ItemId1 
    GROUP BY od.ItemId 
    UNION ALL 
    SELECT 
     od.ItemId, 
     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 = @ItemId1 
    GROUP BY od.ItemId 
    UNION ALL 
    SELECT 
     od.ItemId, 
     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 = @ItemId1 
    GROUP BY od.ItemId 
    UNION ALL 
    SELECT 
     od.ItemId 
     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 = @ItemId1 
    GROUP BY od.ItemId 
) as t 
GROUP BY ItemId; 
+0

それは働いていましたが... '0〜29行(合計2,890件、クエリーが137.2460秒かかった)'の表示は他に何かありますか? –

+0

説明プランを確認してください。あなたのテーブルに良いインデックスがありますか? –

+0

申し訳ありませんどのような良いインデックスですか? –

関連する問題