2016-04-27 112 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 

荫得到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 

现在我正在重复记录的商品代码11 2的所有10条记录。 我希望将Y值映射到物品代码11本身,其他所有物品都应该为零

+0

请使用t1和t2之间的连接 –

+0

你想完成什么?我可能会建议你问另一个问题(这个问题已经有答案),并解释你在做什么,提供样本数据和期望的结果。 –

回答

5

您的问题是旧式笛卡尔连接充当CROSS JOIN。如果您考虑正确加入,您不会将数据翻倍;

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现在将显示0,没有数据而不是按要求填充NULL。

在这个问题上有一些很好的资源;

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之间的规定。如果您期望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; 
相关问题