2016-09-22 100 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,但我不知道这个;分开一切。非常感谢! –