2010-06-04 44 views
1

我使用Quality Center跟踪缺陷,我相信它使用MSSQL语言。 我有一个表,其中包含以下字段:defectID,摘要,应用程序,严重性,状态,createDate,closedDate。将涵盖相关领域。SQL语句跟踪每天按应用程序打开的缺陷数

defectID application severity createDate closedDate 
-------- ----------- -------- ---------- --------- 
1  app1  sev1  3/10/2010 3/23/2010 
2  app1  sev1  3/15/2010 3/23/2010 
3  app2  sev1  3/14/2010 3/25/2010 
4  app1  sev2  3/18/2010 3/24/2010 
5  app1  sev1  3/15/2010 3/19/2010 
6  app1  sev1  3/25/2010 

我需要SQL来输出给定日期打开的sev1缺陷的数量。我想提供日期范围。这是输出样本?其中一些在SQL我将确定的3/22开始日期和3/26

application 3/22 3/23 3/24 3/25 3/26 
--------------------------------------- 
app1  3 1 0 1 1 
app2  1 1 1 0 0 

的结束日期如果应用为是水平(表去对面)和日期必须是垂直的(名单下去)这很好。任何帮助表示赞赏。

回答

0

你必须使它成为一个表自己,但

SELECT createDate, application, COUNT(*) FROM Defects GROUP BY createDate, application 

应该给你的数据。如果您希望数据直接来自您的RDBMS,就像您绘制它一样,您必须像其他答案所建议的那样动态创建查询。

0

用途:

SELECT t.application, 
     SUM(CASE WHEN '3/22/2010' BETWEEN t.createdate AND t.closedate THEN 1 ELSE 0 END) AS "3/22", 
     SUM(CASE WHEN '3/23/2010' BETWEEN t.createdate AND t.closedate THEN 1 ELSE 0 END) AS "3/23", 
     SUM(CASE WHEN '3/24/2010' BETWEEN t.createdate AND t.closedate THEN 1 ELSE 0 END) AS "3/24" 
    FROM TABLE t 
GROUP BY t.application 

我没有做所有这些,但有足够的例子。动态日期范围需要使用动态SQL。

+0

@ OMG-Ponies - 它不考虑未结案日期。像这样: SUM(CASE WHEN'3/22/2010'BETWEEN t.createdate AND coalesce(t.closedate,'3/22/2010')THEN 1 ELSE 0 END)AS“3/22”, – msi77 2010-06-05 09:51:03

+0

感谢您的回复,我正在通过解决方案。有一个标准我忘了说明,如果缺陷是3/22和3/23的sev3,然后在3/24上升到sev1。所以,当我运行3/24或任何一天之后的SQL时,它将在3/22和3/23的计数中包含该缺陷。为了解决这个问题,我想我必须找出如何在包括那天的计数之前检查sev在那一天的情况。我有一个表格,它记录了更改日期,缺陷编号,现场更改,旧值和新值的审计历史记录。 – user358866 2010-06-06 19:18:36

+0

虽然试图弄清楚,但我的大脑因过载而关闭,这就是为什么我花了一段时间来回应。我很感激帮助,它让我非常接近。现在,我只需要考虑这个标准。任何帮助,非常感谢。 – user358866 2010-06-06 19:18:54

0

一个慵懒的午后产生的混乱,你都不可能使用...它有点脏,但它似乎工作:d

这主要是答案的修改版本以上情况说明,只是用枢轴命令。请注意,这只适用于Sql Server 2005及更高版本。如果你有2000,那么你必须以动态的方式使用上面的case方法。

declare @startDate datetime 
declare @EndDate datetime 
declare @Dates varchar(max) 
declare @nums varchar(max) 
select @startdate = '3/22/10', @endDate = '3/26/10', @Dates = '', @nums = '' 

;with nums as (
    select row_number() over (order by object_id)-1 as num from sys.objects   
) 
select @dates = '' + '[' + convert(varchar(8),num) + '] as ' + '''' + cast(Dateadd(day,num,@StartDate) as varchar(11)) + ''',' + @dates 
,@nums = '[' + convert(varchar(8),num) + '],' + @nums 
    from nums 
    where num between 1 and DateDiff(day,@StartDatE,@EndDate) 
    order by num desc 

select @dates = substring(@dates,0,len(@dates)), @nums = substring(@nums,0,len(@nums)) 

declare @qry varchar(max) 
set @qry = ';with nums as (
    select row_number() over (order by object_id)-1 as num from sys.objects   
) 
select AppName, ' + @dates + ' from (select [Application],[Application] as AppName, num as cnt from ##temp 
    cross join nums 
     where num between 1 and ' + convert(varchar(8),DateDiff(day,@StartDatE,@EndDate)) + '+1 
     and Dateadd(day,num,''' + cast(@StartDate as varchar(11)) +''') between CreateDate and closeddate 
     ) as p 
    pivot (count([Application]) for [cnt] in (' [email protected] + ')) as pvt' 

exec (@qry)