2016-09-22 3 views
1

База данных: SQL ServerВычитание двух операторов корпуса

Надеюсь, это действительно просто. У меня есть запрос на заказ на поставку, и я пытаюсь вычесть два аргумента case, но у меня возникают проблемы с его работой. Я использую временных таблиц для извлечения данных в заказе на поставку в

См запрос ниже:.

--temp table for PO Inventory lines 
select 
prchseordr_id, 
ISNULL (sum(prchseordrlst_cst_extndd),0) as Inv_Cost 
INTO #TempPOInv 

from prchseordr 
left outer join prchseordrlst on prchseordr.prchseordr_rn = prchseordrlst.prchseordr_rn 
where prchseordr_nxt_id = '' 
group by prchseordr_id 
-------------------- 
--temp table for PO General lines 
select 
prchseordr_id, 
ISNULL (sum(prchseordrlstgn_cst_extndd),0) as Gen_Cost 
INTO #TempPOGen 

from prchseordr 
left outer join prchseordrlstgn on prchseordr.prchseordr_rn = prchseordrlstgn.prchseordr_rn 
where prchseordr_nxt_id = '' 
group by prchseordr_id 
-------------------- 
--temp table for PO Subcontractor lines 
select 
prchseordr_id, 
ISNULL (sum(prchseordrlstsb_cntrct_amnt_orgnl),0) as Sub_Cost 
INTO #TempPOSub 

from prchseordr 
left outer join prchseordrlstsb on prchseordr.prchseordr_rn = prchseordrlstsb.prchseordr_rn 
where prchseordr_nxt_id = '' 
group by prchseordr_id 

------------------------------------------------------------ 
Select 
vndr_nme as [Vendor Name], 
sum(CASE WHEN prchseordr_type = 'Purchase' THEN Inv_Cost + Gen_Cost + Sub_Cost else 0 end) Purchases, 
sum(CASE WHEN prchseordr_type = 'Credit' THEN Inv_Cost + Gen_Cost + Sub_Cost else 0 end) Credits 
from prchseordr 
left outer join #TempPOInv on prchseordr.prchseordr_id = #TempPOInv.prchseordr_id 
left outer join #TempPOGen on prchseordr.prchseordr_id = #TempPOGen.prchseordr_id 
left outer join #TempPOSub on prchseordr.prchseordr_id = #TempPOSub.prchseordr_id 
join vndr on prchseordr.vndr_rn = vndr.vndr_rn 
where prchseordr.prchseordr_entrd_dte between @[email protected] and @[email protected] 
and prchseordr_rn <> 0 
group by vndr_nme,prchseordr_type 
order by vndr_nme 


DROP TABLE #TempPOInv 
DROP TABLE #TempPOGen 
DROP TABLE #TempPOSub 

Довольно основной, я просто хочу, чтобы вычесть закупки из кредитов, чтобы получить чистую общую сумму заказов на поставку. Каков наилучший способ сделать эту работу?

+0

Пожалуйста, включите некоторые выборочные данные, чтобы показать, что вы пытаетесь делать. Что вы пытаетесь получить в результате? – Siyual

+0

Учитывая, что 'prchseordr_type' не может быть как' Purchase', так и 'Credit', я не вижу, что вы могли бы вычесть. Кажется, что вам не хватает группировки или какого-либо другого механизма. –

+0

На боковой ноте на любой ответ, который вы выберете, вы можете добавить 'ISNULL (..._ Cost, 0)' (или что-то подобное) вокруг столбцов '..._ Cost', если у вас может быть' NULL 'значения в них. В противном случае 'NULL + AnyValue = NULL'. – BJones

ответ

1

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

После этого, наиболее читаемых было бы поместить его в подзапрос или КТР, как:

select 
    x.[Vendor Name] 
    ,x.Credits - x.Purchases [Profit] 
from 
(
    Select 
     vndr_nme as [Vendor Name], 
     sum(CASE WHEN prchseordr_type = 'Purchase' THEN Inv_Cost + Gen_Cost + Sub_Cost else 0 end) Purchases, 
     sum(CASE WHEN prchseordr_type = 'Credit' THEN Inv_Cost + Gen_Cost + Sub_Cost else 0 end) Credits 
    From ... 
) x 

Или:

;with x as (
    Select 
     vndr_nme as [Vendor Name], 
     sum(CASE WHEN prchseordr_type = 'Purchase' THEN Inv_Cost + Gen_Cost + Sub_Cost else 0 end) Purchases, 
     sum(CASE WHEN prchseordr_type = 'Credit' THEN Inv_Cost + Gen_Cost + Sub_Cost else 0 end) Credits 
    From ... 
) 
select 
    x.[Vendor Name] 
    ,x.Credits - x.Purchases [Profit] 
from x 
+0

Я не мог заставить CTE работать. Я включил полный запрос выше. –

+0

У меня была опечатка - это 'x' после того, как закрывающий палец не должен быть там. Ред. –

+0

Спасибо! Я заработал. Я не понимал, что мне нужно; чтобы все было раздельно. Я пытался сделать работу CTE все утро. Цените помощь. –

1

Пара путей ... один КТР

;with cte as(
Select 
vndr_nme as [Vendor Name], 
sum(CASE WHEN prchseordr_type = 'Purchase' THEN Inv_Cost + Gen_Cost + Sub_Cost else 0 end) Purchases, 
sum(CASE WHEN prchseordr_type = 'Credit' THEN Inv_Cost + Gen_Cost + Sub_Cost else 0 end) Credits 
from prchseordr 
left outer join #TempPOInv on prchseordr.prchseordr_id = #TempPOInv.prchseordr_id 
left outer join #TempPOGen on prchseordr.prchseordr_id = #TempPOGen.prchseordr_id 
left outer join #TempPOSub on prchseordr.prchseordr_id = #TempPOSub.prchseordr_id 
join vndr on prchseordr.vndr_rn = vndr.vndr_rn 
where prchseordr.prchseordr_entrd_dte between @[email protected] and @[email protected] 
and prchseordr_rn <> 0 
group by vndr_nme,prchseordr_type) 

select 
    [Vendor Name], 
    Purchases, 
    Credits, 
    Purchases - Credits as NewColumn 
from cte 
+0

Я не мог заставить CTE работать. Я обновил сообщение, чтобы включить полный запрос. –

+0

@AdrianWarness я отредактировал мой ответ. Просто замените эту часть вашего кода. Убедитесь, что вы включили; перед cte – scsimon

+0

Я идиот! Я пытаюсь сделать КТО все утро, но я не знал об этом; отделить все. Спасибо огромное! –

Смежные вопросы