Je dois suivre le tableau de SQL Server:
INTERVAL FAILED OK 2009-01-01 12:00:00-2009-01-01 12:15:00 1 2 2009-01-01 12:15:01-2009-01-01 12:30:00 0 1
6 Réponses :
Parce que je ne connais pas votre nom de table, quelque chose comme ça devrait fonctionner.
DECLARE @startTime DATETIME
DECLARE @endTime DATETIME
SELECT @startTime = '1/1/2010 00:00:00'
SELECT @endTime = GETDATE()
SELECT
cast(@startTime as varchar) + ' - ' + cast(@endTime as varchar) as Interval,
(select count(1) from [table] where status = 'FAILED') as FAILED,
(Select count(1) from [table where status = 'OK') as OK
FROM
[table]
WHERE
date between @startTime and @endTime
Cela ne prend pas en compte l'intervalle dont vous avez besoin, mais vous pouvez l'utiliser pour sélectionner manuellement le délai.
Vous devriez faire une boucle pour obtenir tous les résultats.
Il pourrait y avoir un moyen plus facile de le faire, mais cela fonctionne:
--CREATE TABLE temptest
--(
-- date1 DATETIME,
-- stat nvarchar(10)
--)
--INSERT INTO temptest
--VALUES
--('2009-01-01 12:00:00','OK'),
--('2009-01-01 12:03:00','FAILED'),
--('2009-01-01 12:04:00','OK'),
--('2009-01-01 12:06:20','OK'),
--('2009-01-01 12:07:35','FAILED'),
--('2009-01-01 12:07:40','FAILED'),
--('2009-01-01 12:20:40','FAILED'),
--('2009-01-01 12:25:40','OK')
SELECT
stat,
COUNT(1),
YEAR(date1),
MONTH(date1),
DAY(date1),
DATEPART(hh,date1),
ROUND(DATEPART(MINUTE,date1)/10,0)
FROM temptest
GROUP BY stat, YEAR(date1), MONTH(date1), DAY(date1), DATEPART(hh,date1), ROUND(DATEPART(MINUTE,date1)/10,0)
Ceci utilise un CTE récursif. La sortie ressemble à ceci: p> Veuillez noter dans vos données que vous avez le même nombre d'échecs et d'ok dans les emplacements horaires . p> p>
OK Tout d'abord ..
Vous mentionnez 10 minutes et la fourniture d'un exemple avec 15 minutes .. En outre, vos échantillons de données doivent renvoyer différents résultats que ce que vous avez posté .. p>
ceci retournera p> mise à jour après les commentaires < / em> strong> p> Cette version inclura des intervalles de temps qui n'ont pas de valeurs dans la base de données.
Nous devrons créer une table temporaire sur la volée .. p> Utilisation d'un intervalle de 10 minutes maintenant, pour afficher une période sans valeurs, retourne .. p> < Pré> xxx pré> p>
Une fois que j'ai pu envelopper ma tête autour de ce que fait le pivot, j'ai réalisé que cela a été fait de génial, et i> il ne le fait qu'avec une seule table.
( hochement de signe i>) ( signe de tête i>) .. jolie cool stuff .. seulement appris à ce sujet récemment moi-même.)
La solution est belle, mais saute des intervalles de saut. DT_FROM DT_TO Connexion TEMCINÉ TEMINDÉE Connecté 2010-02-05 19: 15: 00.000 2010-02-05 19: 30: 00.000 0 1 2 0 2010-02-05 19: 45: 00.000 2010 -02-05 20: 00: 00.000 0 3 6 0 2010-02-05 20: 00: 00.000 2010-02-05-02-05 20: 15: 00.000 0 4 5 0 2010-02-05 20: 30: 00.000 2010-02 -05 20: 45: 00.000 0 1 2 0
Oui @stefan, le code apportera des résultats basés sur les enregistrements réels qui existent ... pour des périodes sans enregistrements Aucun résultat n'est renvoyé. Je verrai si je peux la modifier pour inclure toutes les 0 périodes ..
@stefan, ajouté deuxième solution qui s'occupe des intervalles sans aucune valeur correspondante dans la base de données ..
Une autre option ...
Voici la version de la table Tally.
Configurez quelques données factices: P>
select
xx.FromTime
,sum(case when mt.Status = 'OK' then 1 else 0 end) HowManyOk
,sum(case when mt.Status = 'Failed' then 1 else 0 end) HowManyFailed
from (select
dateadd(mi, (Number-1) * 10, @StartAt) FromTime
,dateadd(mi, Number * 10, @StartAt) ThruTime
from Tally where Number <= datediff(mi, @StartAt, @Through) /10) xx
inner join MyTable mt
on mt.MyDate >= xx.FromTime and mt.MyDate < xx.ThruTime
group by xx.FromTime
D'une base de référence très basique à l'intérieur du studio SQL SerRVer Management Studio ( Mettre le code dans une boucle et en prenant avant et après les heures i>), la version que j'ai suggérée fonctionne sensiblement plus rapidement que le Tally One ..
Vous dites toutes les 10 minutes mais l'exemple montre tous les 15 ..