SQL Server 2005, подсчет итогов - PullRequest
2 голосов
/ 28 июня 2011

Я хотел бы знать, как запросить базу данных, с помощью которой я могу вернуть две суммы, сначала общее количество проверок, а затем общее количество для каждого инспектора, т. Е. Джо провел в общей сложности 4 проверки, но все еще показывает разбивкуразных уровней.Я новичок в SQL, поэтому пока включил мой скрипт, но дайте мне знать, если вам нужна дополнительная информация.

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

Я хотел бы увидеть

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

Ответы [ 3 ]

2 голосов
/ 28 июня 2011

Я не уверен насчет сервера sql, но в oracle следующий запрос даст желаемый результат -

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;

пожалуйста, проверьте ваше where состояние .. Я проверял и работал только для последнего желаемого столбца .. поскольку в вашем вопросе вы ничего не говорите об условиях ...

, пожалуйста, прокомментируйте здесь, если вы хотите получить разъяснения по этому вопросу.

еще одна вещь - я предположил, что вы хотите значение столбца InspTotal только один раз для любого кода InspectorCode .. я прав ??

1 голос
/ 28 июня 2011

РЕДАКТИРОВАТЬ: Исходя из ответа @pratik garg, похоже, что это работает в 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

count(*) over (partition by InspectorCode), очевидно, учитывает условие where, но учитывает несколько групп.Интересно:)

0 голосов
/ 28 июня 2011

Следующий пример кода работает нормально для моей базы данных

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

Таким образом, "переводя" мой код на ваш запрос

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
...