2016-09-27 57 views
0

我目前遇到了一个我正在尝试创建的计算问题。如何根据单列的多个列值推导出列

所以我有8列,都具有相同的3个值:

1 = pass , 2 = borderline , 3 = Fail. 

我需要能够计算出一个新列,这将说明如下:

Pass = All 8 fields equals '1' 
Borderline = 7 Fields that equal '1' with one field that equals '2' 
Else Fail 

这似乎是一个容易计算,但我一直徘徊在边界逻辑上,因为8列中的任何一列都可能有'2'?

任何帮助将不胜感激。

+0

你试过什么吗? – Arti

回答

1

如果你的列将只有1,2或3,那么你可以试试这个

case Col1 + Col2 + Col3 + Col4 + Col5 + Col6 + Col7 + Col8 When 8 Then 'Pass' 
when 9 Then 'Borderline' 
Else 'Fail' 
End 
0

你可以简单计算出总的8列,而如果该值大于9这是一个失败。这假定在8列中没有NULL或0值。

SELECT Col1 + Col2 + Col3 + Col4 + Col5 + Col6 + Col7 + Col8 AS Total 
0

您可以使用简单的加法和CASE语句来解决这个问题。

规则:

  • 8道:总总是= 8
  • 7次通过,1条边界线:总是= 9
  • 任何其它组合=失败

示例代码:

-- dummy table 
CREATE TABLE #temp 
    (
     c1 INT , c2 INT , c3 INT , c4 INT , 
     c5 INT , c6 INT , c7 INT , c8 INT 
    ) 

-- dummy data  
INSERT INTO #temp 
     (c1 , c2 , c3 , c4 , 
      c5 , c6 , c7 , c8 
     ) 
SELECT 1,1,1,1,1,1,1,1 
UNION ALL 
SELECT 1,1,1,1,1,1,2,1 
UNION ALL 
SELECT 1,2,3,1,1,1,1,2 

-- query to calculate totals and pass/fail 
SELECT *, 
    CASE t.Total WHEN 8 THEN 'Pass' 
       WHEN 9 THEN 'Border Line' 
       ELSE 'Fail' END Overall 
FROM (SELECT * , 
        c1 + c2 + c3 + c4 + c5 + c6 
        + c7 + c8 Total 
      FROM  #temp 
     ) t 
-- clean up 
DROP TABLE #temp 

产品:

c1 c2 c3 c4 c5 c6 c7 c8 Total Overall 
1 1 1 1 1 1 1 1 8  Pass 
1 1 1 1 1 1 2 1 9  Border Line 
1 2 3 1 1 1 1 2 12  Fail