2016-04-27 2 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 получить, что имеет-выходЕсть ли лучший способ, чтобы написать этот запрос на выборке

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

Ваша проблема в том, что декартовое соединение старого стиля, которое действует как ПЕРЕКРЕСТНЫЙ СОЕДИНЕНИЕ. Если вы сочтете подходящее соединение, вы не будете удваивать свои данные;

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, если нет данных, я хочу показать 0. Как получить это. – Venkatvasan

+0

измените выбор на «ISNULL (t2.X, 0) t2_x '. Я редактировал оригинальный код, чтобы показать вам пример. –

3

Вы не имеете РЕГИСТРИРУЙТЕСЬ указания между производной таблицы t1 и t2. Вам нужно использовать LEFT JOIN, если вы ожидаете результатов от t1, но не 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; 
Смежные вопросы