2016-09-22 138 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

在你選擇的任何一個答案的旁註中,你可能想要在你的'..._ Cost'列周圍添加'ISNULL(..._ Cost,0)'(或類似的東西),如果你可能有'NULL在他們的價值。否則,一個'NULL + AnyValue = NULL'。 – BJones

回答

1

關注你的case語句 - 你要根據情況進行總結。

之後,最可讀的將是把它變成一個子查詢或CTE,如:

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

我有一個錯字 - 關閉paren後的'x'不應該在那裏。編輯。 –

+0

謝謝!我得到它的工作。我沒有意識到我需要;保持一切分開。我試圖讓CTE整個上午工作。感謝幫助。 –

1

夫婦的方式......一個是CTE

;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

我是個白癡!我一直試圖做一個CTE,但我不知道這個;分開一切。非常感謝! –