2013-02-05 4 views
2

J'essaie de créer une requête pour me fournir le délai d'exécution en minutes d'un certain nombre de lignes de données de test.Requête SQL Server Distinct avec plusieurs comptes conditionnels

Une version succincte de la table est:

TestName, StartDateTime, EndDateTime

Je suis à la recherche d'une requête qui peut me donner un quelque chose comme de sortie:

Distinct TestName 
, StartDate[not time] 
, Count(rows) as Total 
, Count(rows where datediff(minute, StartDateTime, EndDateTime) <=60) as NonBreach 
, Count(rows where datediff(minute, StartDateTime, EndDateTime) >60) as Breach 
, Count(rows where datediff(minute, StartDateTime, EndDateTime) >60)/Count(rows) as BreachRate 

Est-ce principe même possible?

Toute direction serait grandement appréciée.

+0

Vous pouvez également rejoindre toujours les résultats forment différentes requêtes sur TestName – Techmonk

Répondre

4

Vous pouvez utiliser quelque chose comme ceci:

SELECT TestName, 
     CAST(StartdateTime AS DATE) AS StartDate, 
     COUNT(*) AS Total, 
     COUNT(CASE WHEN DATEDIFF(MINUTE, StartDateTime, EndDateTime) <= 60 THEN 1 END) AS NonBreach, 
     COUNT(CASE WHEN DATEDIFF(MINUTE, StartDateTime, EndDateTime) > 60 THEN 1 END) AS Breach, 
     1.0 * COUNT(CASE WHEN DATEDIFF(MINUTE, StartDateTime, EndDateTime) > 60 THEN 1 END)/COUNT(1) AS BreachRate 
FROM YourTable 
GROUP BY TestName, CAST(StartdateTime AS DATE) 

Bien que selon votre SGBD vous pouvez avoir besoin pour utiliser une méthode différente de suppression de l'heure à partir de la date


Suppression du temps de la date:


SQL-Server 2008 et plus tard:

SELECT CAST(CURRENT_TIMESTAMP AS DATE) 

SQL-Server 2005 et versions antérieures

SELECT DATEADD(DAY, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP), 0) 

MySQL & SQLite

SELECT DATE(CURRENT_TIMESTAMP) 

Oracle

SELECT TRUNC(CURRENT_TIMESTAMP) 

Postgresql

SELECT CURRENT_TIMESTAMP::DATE 

+1

+1 pour votre méthode '1.0 *' de conversion en décimal. Mais vous avez deux noms de colonne 'Startdate' qui sont' StartDateTime' dans l'OP. –

+0

@BernhardHofmann Merci. Edité et modifié en 'StartDateTime'. – GarethD

+1

Merci pour les bits additioanl sur la manipulation de la date. – user2044096

2

Utilisation de SQL Server 2008 syntaxe (autres bases de données ont des méthodes légèrement différentes pour datediff et cast(... as date):

select TestName 
,  cast(StartDateTime as date) as StartDate 
,  count(*) as Total 
,  sum(case when datediff(minute, StartDateTime, EndDateTime) <= 60 
      then 1 end) as NonBreach 
,  sum(case when datediff(minute, StartDateTime, EndDateTime) > 60 
      then 1 end) as Breach 
,  1.0 * sum(case when datediff(minute, StartDateTime, EndDateTime) > 60 
      then 1 end)/count(*) as BreachRate 
from YourTable 
group by 
     TestName 
,  cast(StartDateTime as date) 
+0

Merci beaucoup - ce qu'un Muppet - si simple; ma tête vient d'avoir besoin de tests distincts. – user2044096

0

Pour autant que je sache, il est impossible de le faire comme ça.Peut-être que vous pourriez faire quelque chose comme ceci:

Select TestName 
    , StartDate[not time] 
    , Count(rows) as Total 
    , SUM(CASE WHEN datediff(minute, StartDateTime, EndDateTime) <=60 THEN 1 ELSE 0 END) as NonBreach 
    , SUM(CASE WHEN datediff(minute, StartDateTime, EndDateTime) >60 THEN 1 ELSE 0 END) as Breach 
+1

Vous ne pouvez pas utiliser des agrégats distincts (comme la somme ou le nombre) dans la même requête – Andomar

+0

Votre droit, je viens de copier la question et je n'ai pas changé. Pardon –

Questions connexes