2011-06-28 2 views
2

Je voudrais savoir comment interroger une base de données par laquelle je peux retourner deux sommes, la première étant le nombre total d'inspections, puis un total pour chaque inspecteur, par exemple, Joe a fait un total de 4 inspections, mais montre encore une répartition des différents niveaux. Je suis nouveau sur sql alors j'ai inclus mon script, mais laissez-moi savoir si vous avez besoin de plus d'infos.SQL Server 2005, compter les totaux

SELECT  InspectorCode AS Inspector, InspectionProcedureName AS [Procedure], COUNT(*) AS  Total 
FROM   UnitData_Vehicle 
WHERE  (DATEDIFF(day, InspectionDateTime, GETDATE()) = 1) 
AND InspectionProcedureName LIKE '%Inspection%' 
GROUP BY InspectionProcedureName, InspectorCode 

Je voudrais voir

Inspector Procedure Total InspTotal 
joe   1 - Inspection 1  4 
joe   2 - Inspection 3 
kit   3 - Inspection 14  14 
hugh  1 - Inspection 17  32 
hugh  6 - Inspection 15 
mike  4 - Inspection 18  18 

Répondre

1

EDIT: Sur la base de la réponse de @pratik Garg, ressemble à cela fonctionne dans SQL Server:

select InspectorCode as Inspector 
,  InspectionProcedureName as Procedure 
,  count(*) as Total 
,  count(*) over (partition by InspectorCode) as InspTotal 
from UnitData_Vehicle as uv1 
where (datediff(day, InspectionDateTime, getdate()) = 1) 
     and InspectionProcedureName like '%Inspection%' 
group by 
     InspectorCode 
,  Procedure 

Le count(*) over (partition by InspectorCode) honore apparemment la clause where , mais compte sur plusieurs groupes. Intéressant :)

+0

Merci les gars, celui-ci fonctionne cependant il compte combien de chaque procédure que l'inspecteur a fait ie Joe a fait 2 types d'inspection. Si possible, j'aimerais voir le nombre total d'inspections effectuées pour chaque inspecteur, c'est-à-dire que Joe en a fait 4. Mais merci pour vos efforts jusqu'à maintenant! – Tyrone2011

+0

@ Tyrone2011: La colonne InspTotal devrait montrer le nombre total d'inspections pour un gestionnaire, voir [cet exemple à odata] (http://data.stackexchange.com/stackoverflow/q/104184/) – Andomar

2

Je ne suis pas sûr de serveur SQL, mais dans l'oracle suivant la requête donnera résultat que vous veux-

SELECT zz.Inspector as Inspector, 
     zz.Procedure as Procedure, 
     zz.total as total, 
     case 
     when zz.c_1 =1 then 
     zz.InspTotal 
     else 
     null 
     end as InspTotal   
     FROM (SELECT InspectorCode AS Inspector, 
     InspectionProcedureName AS Procedure, 
     COUNT(*) AS  Total , 
     count(*) over(partition by InspectorCode) InspTotal, 
     row_number() over(partition by InspectorCode order by InspectionProcedureName) c_1 
FROM UnitData_Vehicle 
WHERE (DATEDIFF(day, InspectionDateTime, GETDATE()) = 1) 
     AND InspectionProcedureName LIKE '%Inspection%' 
GROUP BY InspectionProcedureName, InspectorCode)zz; 

s'il vous plaît vérifier votre état where .. Je vérifiais et travailler pour la dernière colonne souhaitée seulement .. comme vous ne l'avez pas question vous dire quoi que ce soit sur les conditions ...

s'il vous plaît commentaire ici si vous voulez des précisions sur quoi que ce soit dans cette requête ..

encore une chose - J'ai supposé que vous voulez la valeur de colonne InspTotal une seule fois pour tout code InspectorCode .. ai-je raison ??

+0

+ 1 intéressant, je pensais que vous ne pouviez pas N'utilisez pas «over» pour sortir du groupe – Andomar

+0

merci pour cela mais cela ne fonctionne pas avec sql, mais oui vous avez raison je voudrais seulement voir une valeur par total, ou null si aucune valeur n'est retournée. Merci ! – Tyrone2011

+0

@Andomar: Je suis désolé mais je ne vous ai pas bien compris. ne pouvait pas utiliser !!!! –

0

Le code exemple suivant fonctionne très bien pour ma base de données

SELECT fiscalmonth,item,fiscalyear 
     ,SUM(valuesale) 
     , 
(SELECT SUM(valueSale) 
FROM inbalance b 
WHERE b.fiscalmonth <= a.fiscalmonth 
and a.fiscalyear =b.fiscalyear 
and a.item = b.item 
) AS RunningTotal 
FROM inbalance a 
WHERE a.item='1101' 
AND a.fiscalyear=2011 
GROUP BY fiscalmonth,item,fiscalyear 

donc par « traduire » mon code à votre requête

SELECT  InspectorCode AS Inspector, InspectionProcedureName AS [Procedure], COUNT(*) AS  Total 
, (
SELECT COUNT(*) FROM UnitData_Vehicle b 
WHERE a.InspectorCode = b.InspectorCode 
AND b.InspectionProcedureName <= b.InspectionProcedureName 
GROUP BY InspectionProcedureName,InspectorCode 
) As InspTotal 
FROM   UnitData_Vehicle a 
WHERE  (DATEDIFF(day, InspectionDateTime, GETDATE()) = 1) 
AND InspectionProcedureName LIKE '%Inspection%' 
GROUP BY InspectionProcedureName, InspectorCode 
+0

Msg 207, niveau 16, état 1, ligne 4 Nom de colonne incorrect 'inspecteur'. Msg 4104, niveau 16, état 1, ligne 4 L'identificateur en plusieurs parties "b.inspector" n'a pas pu être lié. Msg 4104, niveau 16, état 1, ligne 4 L'identificateur en plusieurs parties "b.InspectionProcedureName" n'a pas pu être lié. Msg 4104, niveau 16, état 1, ligne 4 L'identificateur en plusieurs parties "b.InspectionProcedureName" n'a pas pu être lié. Msg 207, niveau 16, état 1, ligne 6 Nom de colonne incorrect 'Inspecteur'. – Tyrone2011

+0

merci pour ce script, semble bon, mais j'ai reçu quelques erreurs? des idées? merci – Tyrone2011

+0

Ça devrait aller maintenant. Si ce n'est pas le cas, donnez-moi la sortie d'erreur. – niktrs