Получить все строки с помощью левого соединения в подзапросе - PullRequest
0 голосов
/ 09 сентября 2018

При использовании SQL Server 2008 R2 у меня возникла проблема с получением строк с использованием левого соединения в подзапросе с двумя разными диапазонами дат.

Таблицы, которые я использовал для хранения значений

И до сих пор я использовал этот sql для получения выходных данных (Извлечено из переполнения стека)

SELECT 
    TT.TransferRId, RM.ResourceName AS BookName, 
    COALESCE(Opening,0) AS Opening, 
    SUM(TT.InwardQty) AS Inward, 
    SUM(TT.OutwardQty) AS Outward, 
    COALESCE((Opening + (SUM(TT.InwardQty)) - (SUM(TT.OutwardQty))), 0) AS Closing
FROM 
    ((ResourceMaster RM 
LEFT JOIN 
    TransferTrans TT ON TT.TransferRId = RM.ResourceId)
LEFT JOIN 
    TransferRegister TR ON TR.TransferRegisterId = TT.TransRegisterId)
LEFT JOIN 
    (SELECT 
         TT.TransferRId,
         (SUM(TT.InwardQty)- SUM(TT.OutwardQty)) AS Opening
     FROM 
         TransferTrans TT  
     LEFT JOIN 
         TransferRegister TR ON TR.TransferRegisterId = TT.TransRegisterId
     WHERE 
         TR.TransferDate < '2018-09-01'
         AND TT.Siteid = 2 
     GROUP BY 
         TT.TransferRId) AS Stock ON Stock.TransferRId = TT.TransferRId
WHERE 
    TT.Siteid = 2
    AND TR.TransferDate BETWEEN '2018-09-01' AND '2018-09-30'
GROUP BY 
    TT.TransferRId, RM.ResourceName, Opening

Выход для вышеприведенного запроса

Ожидаемый результат

Посоветуйте дальше, чтобы получить ожидаемый результат. Заранее спасибо.

1 Ответ

0 голосов
/ 09 сентября 2018

Условие Where на TransferDate заменяет левое соединение на внутреннее соединение, перемещает его во On:

SELECT 
    TT.TransferRId, RM.ResourceName AS BookName, 
    COALESCE(Opening,0) AS Opening, 
    SUM(TT.InwardQty) AS Inward, 
    SUM(TT.OutwardQty) AS Outward, 
    COALESCE((Opening + (SUM(TT.InwardQty)) - (SUM(TT.OutwardQty))), 0) AS Closing
FROM 
    ResourceMaster RM 
LEFT JOIN 
    TransferTrans TT ON TT.TransferRId = RM.ResourceId
LEFT JOIN 
    TransferRegister TR
  ON TR.TransferRegisterId = TT.TransRegisterId
 AND TR.TransferDate BETWEEN '2018-09-01' AND '2018-09-30'
LEFT JOIN 
    (SELECT 
         TT.TransferRId,
         (SUM(TT.InwardQty)- SUM(TT.OutwardQty)) AS Opening
     FROM 
         TransferTrans TT  
     LEFT JOIN 
         TransferRegister TR 
       ON TR.TransferRegisterId = TT.TransRegisterId
      AND TR.TransferDate < '2018-09-01'
     WHERE TT.Siteid = 2 
     GROUP BY 
         TT.TransferRId) AS Stock ON Stock.TransferRId = TT.TransferRId
WHERE 
    TT.Siteid = 2
GROUP BY 
    TT.TransferRId, RM.ResourceName, Opening

Существует эмпирическое правило, которое обычно подходит: условия на внешней таблице помещаются в WHERE, тогда как условия на внутренней таблице AND приводятся к условию соединения в ON

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...