2010-06-04 3 views
1

J'utilise Quality Center pour suivre les défauts, je crois qu'il utilise le langage MSSQL. J'ai une table qui contient les champs suivants: defectID, summary, application, severity, status, createDate, closedDate. Va juste couvrir les champs pertinents.Instruction SQL pour suivre le nombre de défauts ouverts chaque jour par application

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 

J'ai besoin de SQL pour afficher le nombre de défauts SEV1 ouverts à une date donnée. Je voudrais fournir la plage de dates. Voici l'exemple de sortie? Certains où dans le SQL j'identifier la date de début de 3/22 et une date de fin de 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 

Si l'application à être horizontale (liste traversant) et la date doit être verticale (liste en descendant) ça va. Toute aide est appréciée.

Répondre

0

Vous devrez faire une table vous-même, mais

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

devez vous donner les données. Si vous voulez que les données proviennent directement de votre SGBDR, comme vous l'avez dessiné, vous devrez créer dynamiquement la requête comme le suggère l'autre réponse.

0

Utilisation:

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 

Je ne les faisons pas tout, mais il y a assez d'un exemple. Les plages de dates dynamiques nécessitent l'utilisation de SQL dynamique.

+0

@ OMG-Ponies - Ne tient pas compte des dates non divulguées. Quelque chose comme ceci: SOMME (CAS LORSQUE '3/22/2010' ENTRE t.createdate ET coalesce (t.closedate, '3/22/2010') ALORS 1 ELSE 0 FIN) COMME "3/22", – msi77

+0

Merci pour la réponse, je travaille à travers la solution. Il y a un critère que j'ai oublié de prendre en compte et c'est ce que si le défaut était un sev3 le 3/22 et le 3/23, puis élevé à un sev1 le 3/24. Donc, quand je cours le SQL pour 3/24 ou n'importe quel jour après, il inclura ce défaut dans ces comptes pour 3/22 et 3/23. Pour résoudre je pense que je dois trouver comment vérifier ce que le sev était pour cette date avant d'inclure dans les jours qui comptent. J'ai une table qui capture l'historique d'audit de la date de changement, le numéro de défaut, le changement de champ, l'ancienne valeur et la nouvelle valeur. – user358866

+0

En essayant de comprendre cela, mon cerveau s'est arrêté de la surcharge, c'est pourquoi il m'a fallu un certain temps pour répondre. J'apprécie l'aide, ça m'a vraiment rapproché. Maintenant, j'ai juste besoin de rendre compte de ce critère. Toute aide à ce sujet est très appréciée. – user358866

0

Un après-midi paresseux produit le chaos que vous pouvez éventuellement utiliser ... Son un peu sale, mais il semble fonctionner: D

Ceci est la plupart du temps une version modifiée de la réponse ci-dessus avec des déclarations de cas, tout en utilisant la commande de pivot. Notez que ceci ne fonctionnera que dans Sql Server 2005 et au-dessus. Si vous avez 2000, alors vous devrez utiliser la méthode des cas ci-dessus de manière dynamique.

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) 
Questions connexes