2017-04-02 30 views
1

我算算某些案件總量。如何在我的SQL Server場景中使用CASE?

#customerSales表:

ItemLookupCode TotalQuantity 
----------------------------- 
111A000   20   
111B001   320   
111D000   5    
111D001   5    
111D002   1    
111D003   1    

#temp_ItemRelations

ID ItemLookupCode ChildItemLookupCode1 Child1Piece ChildItemLookupCode2 Child2Piece ChildItemLookupCode Child3Piece 
--------------------------------------------------------------------------------------------------------------- 
352 111A000   111A001    5      111A002   3     NULL    NULL  
365 111B000   111B001    4      NULL   NULL     NULL    NULL  
377 111C000   111C001    10      111C002   5     111C003   1 
412 111D000   111D001    12      111D002   8     111D003   4  
601 111E000   111E001    16      111E002   6     111E003   1  

你可以看到ItemLookupCode111D000#temp_ItemRelations,所有兒童都賣,包括父母。

所以輸出應該像下面

ItemLookupCode  TotalQuantity //parent + child1 + child2 + child3 
111D000    77   // 5  + (5*12) + (1*8) + (1*4) 
111A000    20   // 20  + no child 
111B000    1280   // noparent + (4*320)+ nochild2 & 3 

我嘗試下面的查詢。但我不怎麼總結這些價值。我知道以下查詢是錯誤的。但我試過了。

SELECT 
    ir.ItemLookupCode, 
    (CASE 
     WHEN cs.ItemLookupCode = ir.ItemLookupCode 
      THEN cs.TotalQuantity 
     WHEN cs.itemlookupcode = ir1.childitemlookupcode1 
      THEN (cs.TotalQuantity * ir.Child1Piece) 
     WHEN cs.itemlookupcode = ir2.childitemlookupcode2 
      THEN (cs.TotalQuantity * ir.Child2Piece) 
     WHEN cs.itemlookupcode = ir3.childitemlookupcode 
      THEN (cs.TotalQuantity * ir.Child3Piece) 
     ELSE 0 
    END) AS TotalQuantity 
FROM 
    #temp_ItemRelations ir 
LEFT JOIN 
    #customerSales cs ON cs.itemlookupcode = ir.itemlookupcode 
LEFT JOIN 
    #temp_ItemRelations ir1 ON cs.itemlookupcode = ir1.childitemlookupcode1 
LEFT JOIN 
    #temp_ItemRelations ir2 ON cs.itemlookupcode = ir2.childitemlookupcode2 
LEFT JOIN 
    #temp_ItemRelations ir3 ON cs.itemlookupcode = ir3.childitemlookupcode 

回答

4

您的數據結構不正確。您的項目關係應該每個子項關係有一行,而不是多個有數字的列來區分它們。

我不會爲這個計算中使用case所有,只是coalesce()。更重要的是,你似乎都加入到了錯誤的表:

select ir.ItemLookupCode, 
     (coalesce(cs.TotalQuantity, 0) + 
     coalesce(cs1.TotalQuantity * ir.Child1Piece, 0) + 
     coalesce(cs2.TotalQuantity * ir.Child2Piece, 0) + 
     coalesce(cs3.TotalQuantity * ir.Child3Piece, 0) 
     ) as TotalQuantity 
from #temp_ItemRelations ir left join 
     #customerSales cs 
     on cs.itemlookupcode = ir.itemlookupcode left join 
     #customerSales cs1 
     on cs1.itemlookupcode = ir.childitemlookupcode1 left join 
     #customerSales cs2 
     on cs2.itemlookupcode = ir.childitemlookupcode2 left join 
     #customerSales cs3 
     on cs3.itemlookupcode = ir.childitemlookupcode3; 
+0

你能告訴我什麼是'coalesce'爲什麼你每coalesce'添加'零? –

+0

'coalesce'返回從提供給它的參數列表中的第一個非空參數。在上面的代碼中,coalesce(cs.TotalQuantity,0)'等於'cs.TotalQuantity'(如果不爲null),否則爲0。由於將0添加到某個內容並不會改變總和,因此它就像一個方便的if或case。 –

+0

@mohamedfaiz。 。 。如果該值爲「NULL」,則將其視爲「0」。這可以防止表達式返回NULL,因爲其中一個操作數是NULL。 –

0

當你

CASE WHEN條件1 THEN表達式 WHEN條件2 THEN表達式2 ...

這將意味着當condition1爲TRUE時,結果將爲expression1。 只會有對條件2進行檢查時,條件1爲假。