Как найти разницу между двумя столбцами в левом внешнем соединении в SQL Server 2005? - PullRequest
0 голосов
/ 24 января 2012

У меня есть две таблицы Пусть предположим, А и В Теперь предположим, что структура таблицы A имеет вид

id     stock
 37      1
 40      1 
 37      1 
 40      1
 37      1
 37      1

А В такой

id     stock
37      1
37      1 
40      1

Теперь я хочу написать запрос, который даст мне сумму определенного запаса идентификатора в (таблица A - Таблица B), и если этот идентификатор не существует в таблице B, то только запас из A. Так что я буду ожидать такой результат

id     stock

40      1  
37      2

Я думал, что здесь будет возможен левый переход, и я пишу запрос вот так

SELECT A.id, 
    SUM(CAST(isNull(A.Stock, 0) as int) - CAST(isNull(B.Stock, 0) as int) )'Stock'
    from  A
    LEFT OUTER JOIN
    B
    ON A.id = B.id
    group by A.id

Но проблема в том, что приведенный выше запрос дает желаемые записи, но неверное количество / уровень запасов, как показано ниже:

id     stock
37      0
40      1 

Как решить проблему с уровнем запасов.

Ответы [ 2 ]

4 голосов
/ 24 января 2012

Полагаю, вы ищете что-то подобное.

select A.id, A.SumA - coalesce(B.SumB, 0) as stock
from (
       select A.id, sum(A.stock) as SumA
       from A
       group by A.id
     ) as A  
  left outer join
     (
       select B.id, sum(B.stock) as SumB
       from B
       group by B.id
     ) as B
    on A.id = B.id            

Результат:

id          stock
----------- -----------
37          2
40          1

Данные SE

0 голосов
/ 24 января 2012
SELECT A.id, A.Stock - isNull(B.stock, 0) as Stock from A
LEFT OUTER JOIN B
ON A.id = B.id

Думаю, так и будет.
PS. вы группируете что-то, что вы не включили в сценарий вашего дела. Ваш ожидаемый результат также не понятен мне (он конфликтует с описанием вашей проблемы)

...