2016-04-27 3 views
1
SELECT t1.X, 
     t1.Item_Code, 
     t2.X, 
     t2.Item_Code 
FROM (SELECT Sum(e.item_qty) AS X, 
       A.Item_Code 
     FROM [Item Master]A 
       INNER JOIN [Counter Issue Details] e 
         ON e.Item_Code = A.Item_Code 
       INNER JOIN [Counter Master] CM 
         ON CM.Counter_Code = e.Counter_Code 
     WHERE e.Item_Code = A.Item_Code 
       AND A.Type_Code = 0 
     GROUP BY A.Item_Code)t1, 
     (SELECT Sum(e.item_qty) AS X, 
       A.Item_Code 
     FROM [Item Master]A 
       INNER JOIN [Counter Return Details] e 
         ON e.Item_Code = A.Item_Code 
       INNER JOIN [Counter Master] CM 
         ON CM.Counter_Code = e.Counter_Code 
     WHERE e.Item_Code = A.Item_Code 
       AND A.Type_Code = 0 
     GROUP BY A.Item_Code)t2 

はIAMを書くためのより良い方法ははありoutptを取得し、この選択クエリ

X          Item_Code        Y          Item_Code 
--------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- 
3998.000        1          2.00         11 
2000.000        2          2.00         11 
2000.000        3          2.00         11 
2504.000        4          2.00         11 
2384.000        5          2.00         11 
2456.000        6          2.00         11 
2372.000        7          2.00         11 
4900.000        9          2.00         11 
2000.000        10          2.00         11 
3948.000        11          2.00         11 

は今、私はすべての10件のレコードの2として、商品コード11のための重複レコードを取得しています。 アイテムコード11自体にY値をマッピングし、その他はすべてnullにします。

+0

t1とt2の間の結合を使用してください。 –

+0

達成しようとしていることはありますか? *別の質問(これには既に回答があります)を尋ねて、あなたがしていることを説明し、サンプルデータと希望の結果を提供することをお勧めします。 –

答えて

5

あなたの問題は、クロスジョインとして機能する古いスタイルのデカルト結合です。あなたが適切な結合を考えるなら、あなたはあなたのデータを倍増させません。

SELECT t1.Item_Code 
    ,t1.X t1_x 
    ,ISNULL(t2.X,0) t2_x 
FROM (
    SELECT SUM(e.item_qty) AS X 
     ,A.Item_Code 
    FROM [Item Master] A 
    INNER JOIN [Counter Issue Details] e ON e.Item_Code = A.Item_Code 
    INNER JOIN [Counter Master] CM ON CM.Counter_Code = e.Counter_Code 
    WHERE e.Item_Code = A.Item_Code 
     AND A.Type_Code = 0 
    GROUP BY A.Item_Code 
    ) t1 

LEFT JOIN 
    (
     SELECT SUM(e.item_qty) AS X 
      ,A.Item_Code 
     FROM [Item Master] A 
     INNER JOIN [Counter Return Details] e ON e.Item_Code = A.Item_Code 
     INNER JOIN [Counter Master] CM ON CM.Counter_Code = e.Counter_Code 
     WHERE e.Item_Code = A.Item_Code 
      AND A.Type_Code = 0 
     GROUP BY A.Item_Code 
     ) t2 
ON t1.Item_Code = t2.Item_Code 

これは、t1のすべての値とt2の一致情報を返します。編集:t2.Xは、要求されたときにNULLではなくデータなしで0を表示するようになりました。

この件に関するいくつかの素晴らしいリソースがあります。

Which join syntax is better?

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx

+0

ありがとうございますMr.Bennerそれは完璧に動作します。私の日を保存しました – Venkatvasan

+0

何も表示されないデータがある場合はNULLを表示するのではなく、これを取得するには... – Venkatvasan

+0

'ISNULL(t2.X、 0)t2_x 'となる。私は元のコードを編集してその例を示しています。 –

3

あなたは何の派生テーブルt1とt2の間で指定されたJOINを得なかっました。 t1の結果を期待している場合はLEFT JOINを使用する必要がありますが、すべての行についてt2は使用しないでください。

SELECT t1.X 
     , t1.Item_Code 
     , t2.X 
     , t2.Item_Code 
FROM (SELECT SUM(e.item_qty) AS X 
        , A.Item_Code 
      FROM  [Item Master] A 
        INNER JOIN [Counter Issue Details] e ON e.Item_Code = A.Item_Code 
        INNER JOIN [Counter Master] CM ON CM.Counter_Code = e.Counter_Code 
      WHERE  e.Item_Code = A.Item_Code 
        AND A.Type_Code = 0 
      GROUP BY A.Item_Code 
     ) t1 
     LEFT JOIN (SELECT SUM(e.item_qty) AS X 
          , A.Item_Code 
        FROM [Item Master] A 
          INNER JOIN [Counter Return Details] e ON e.Item_Code = A.Item_Code 
          INNER JOIN [Counter Master] CM ON CM.Counter_Code = e.Counter_Code 
        WHERE e.Item_Code = A.Item_Code 
          AND A.Type_Code = 0 
        GROUP BY A.Item_Code 
       ) t2 ON t1.Item_Code = t2.Item_Code; 
関連する問題