如何在SQL Server的方案中使用CASE?

时间:2017-04-02 11:33:43

标签: sql sql-server stored-procedures 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      

您可以在ItemLookupCode中看到#temp_ItemRelations 111D000 ,所有儿童都已售出,包括父母。

所以输出应该如下所示

 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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

当你这样做时

CASE WHEN condition1 THEN expression1      当条件2那么表达2 ...

这意味着当condition1为TRUE时,结果将为expression1。 当condition1为FALSE时,只会检查condition2。