Как получить общее время% для разных кодов - PullRequest
0 голосов
/ 27 апреля 2011

У меня есть таблица с именем Timetable, и данные выглядят так:

Hours   Code    FiMonth  Mgr
16      OT      2011M1   Sam
0.25    DT      2011M1   Peter
1.75    HNE     2011M1   george
6.5     DT      2010M1   Peter
3.25    OT      2010M1   Sam
0.5     DT      2010M2   Sam
30      HNE     2011M1   John

Теперь мне нужно вычислить% времени и формулу, чтобы получить это значение:

Время% = Сумма (DT + OT) Часы / (DT + OT + HNE) Часы

Я написал запрос как:

SELECT  ( ( SELECT  SUM(CONVERT(FLOAT, [Hours])) AS [Hours]
            FROM    Timetable d
            WHERE   d.code IN ( 'OT','DT') 
          )
          / ( SELECT    SUM(CONVERT(FLOAT, [Hours])) AS [Hours]
              FROM      Timetable t
              WHERE     t.code IN ( 'OT', 'DT','HNE')
           ) ) AS Time%
           FROM    Timetable
           GROUP BY Mgr

Мне нужно использовать это значение в моей хранимой процедуре, и у меня есть много таких столбцов. Поэтому я не хочу писать столько кода для одного столбца.

Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 27 апреля 2011
WITH Timetable([Hours],code,FiMonth,Mgr) as
(
SELECT 16,'OT','2011M1','Sam' UNION ALL
SELECT 0.25,'DT','2011M1','Peter' UNION ALL
SELECT 1.75,'HNE','2011M1','george' UNION ALL
SELECT 6.5,'DT','2010M1','Peter' UNION ALL
SELECT 3.25,'OT','2010M1','Sam' UNION ALL
SELECT 0.5,'DT','2010M2','Sam' UNION ALL
SELECT 30,'HNE','2011M1','John'
)
SELECT Mgr,
       SUM(CASE
             WHEN code IN ( 'OT', 'DT' ) THEN CAST([Hours] AS FLOAT)
             ELSE 0
           END)/ NULLIF(SUM(CAST([Hours] AS FLOAT)),0) AS [Time%]
FROM   Timetable t
WHERE  code IN ( 'OT', 'DT', 'HNE' )
GROUP  BY Mgr  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...