2013-02-04 101 views
2

我已经创建了一个简单的数据库来存储测试结果,但我正在努力与SQL计数总计我的通过/失败/警告来提出这一点。SQL Server 2008计数

想法是测试运行(TRID)将有多个测试集(TSID),每个测试集都有几个测试用例(TCID)。

  1. 总应的测试用例等量该TSID
  2. 通行证应的测试用例等量的StatusID = 1
  3. 故障的所有步骤应的测试用例等量的StatusID的1个或多个步骤= 2。
  4. 警告应该等于具有一个或多个StatusID = 3步骤的测试用例的数量,但相同的测试用例应该有零个失败。如果有一个失败的步骤,那么测试用例应该按照上面的方法失败。

SQL创建我的成绩表的一个简单的例子: -

create table Results (StatusID int, TRID int, TSID int, TCID int); 

--Test Set 1/Test Case 1. 
INSERT INTO Results VALUES (1, 1, 1, 1) 
INSERT INTO Results VALUES (1, 1, 1, 1) 
INSERT INTO Results VALUES (1, 1, 1, 1) 
--Test Set 1/Test Case 2 
INSERT INTO Results VALUES (1, 1, 1, 2) 
INSERT INTO Results VALUES (1, 1, 1, 2) 

--Test Set 2/Test Case 1 
INSERT INTO Results VALUES (1, 1, 2, 1) 
INSERT INTO Results VALUES (1, 1, 2, 1) 
INSERT INTO Results VALUES (1, 1, 2, 1) 
--Test Set 2/Test Case 2 
INSERT INTO Results VALUES (1, 1, 2, 2) 
INSERT INTO Results VALUES (2, 1, 2, 2) 

--Test Set 3/Test Case 1 
INSERT INTO Results VALUES (1, 1, 3, 1) 
INSERT INTO Results VALUES (1, 1, 3, 1) 
INSERT INTO Results VALUES (1, 1, 3, 1) 
--Test Set 3/Test Case 2 
INSERT INTO Results VALUES (1, 1, 3, 2) 
INSERT INTO Results VALUES (3, 1, 3, 2) 

--Test Set 4/Test Case 1 
INSERT INTO Results VALUES (1, 1, 4, 1) 
INSERT INTO Results VALUES (1, 1, 4, 1) 
INSERT INTO Results VALUES (1, 1, 4, 1) 
--Test Set 4/Test Case 2 
INSERT INTO Results VALUES (3, 1, 4, 2) 
INSERT INTO Results VALUES (2, 1, 4, 2) 

SELECT * FROM Results 

我现在的SQL(你会看到为我提供了错误的警告数: -

DECLARE @trid INT 
SET @trid = 1 

SELECT TRID, TSID, 
(SELECT COUNT(DISTINCT TCID) FROM Results WHERE R.TRID = @trID AND R.TSID = TSID) As Total, 
(SELECT COUNT(DISTINCT TCID) FROM Results WHERE TRID = @trID AND R.TSID = TSID) - (SELECT COUNT(DISTINCT TCID) FROM Results WHERE TRID = @trID AND R.TSID = TSID AND StatusID = 2) - (SELECT COUNT(DISTINCT TCID) FROM Results WHERE TRID = @trID AND R.TSID = TSID AND StatusID = 3 AND (SELECT COUNT(DISTINCT TCID) FROM Results WHERE TRID = @trID AND R.TSID = TSID AND StatusID = 2) = 0) AS Pass, 
(SELECT COUNT(DISTINCT TCID) FROM Results WHERE R.TSID = TSID AND StatusID=2) As Fail, 
(SELECT COUNT(DISTINCT TCID) FROM Results WHERE R.TSID = TSID AND StatusID=3) As Warning 
FROM Results R 
WHERE TRID = @TRID 
GROUP BY TRID, TSID 

从以上的SQL,目前不正确的结果是: -

TRID TSID Total Pass Fail Warning 
1  1  2  2  0  0 
1  2  2  1  1  0 
1  3  2  1  0  1 
1  4  2  1  1  1* 

次​​的结果应该是....

TRID TSID Total Pass Fail Warning 
1  1  2  2  0  0 
1  2  2  1  1  0 
1  3  2  1  0  1 
1  4  2  1  1  0* 

感谢

+0

哪些列的名称? –

回答

4

你可以在子查询计算每个测试用例(TCID)的统计信息。然后,外部查询可以计算每个测试集(TSID)的统计信息。例如:

select TRID 
,  TSID 
,  count(*) as Total 
,  sum(case when FailSteps = 0 and WarnSteps = 0 then 1 else 0 end) as Pass 
,  sum(case when FailSteps > 0 then 1 else 0 end) as Fail 
,  sum(case when FailSteps = 0 and WarnSteps > 0 then 1 else 0 end) as Warning 
from (
     select TRID 
     ,  TSID 
     ,  TCID 
     ,  sum(case when StatusID = 1 then 1 else 0 end) as PassSteps 
     ,  sum(case when StatusID = 2 then 1 else 0 end) as FailSteps 
     ,  sum(case when StatusID = 3 then 1 else 0 end) as WarnSteps 
     from Results 
     group by 
       TRID 
     ,  TSID 
     ,  TCID 
     ) as TestCases 
group by 
     TRID 
,  TSID 

Live example at SQL Fiddle.

+0

谢谢,这正是我正在寻找的! – muckus