ЕСЛИ <= 0, то 0 с учетом CASE - PullRequest
       2

ЕСЛИ <= 0, то 0 с учетом CASE

0 голосов
/ 09 октября 2019

Использование SQL Server ....

Я начинаю с фиксированного значения, а затем вычитаю определенные типы часов. Я заканчиваю с некоторыми отрицательными и некоторыми положительными числами. Пока все хорошо, но мне нужно, если значение <= 0, тогда я хочу установить значение 0, но просто не могу получить синтаксис совершенно правильно. Любая помощь будет оценена. </p>

... ,36. - SUM(CASE WHEN P.PAYCODECATEGORYFK IN ('REG', 'ABU', 'PTO', 'LEAVE', 'HOL') THEN OTH_HRS ELSE 0 END)  AS 'Unused Capacity'

110019000   7A Antepartum   Unit Technician 09/04/2018  2018-09-02  5.6
110019000   7A Antepartum   Unit Technician 09/11/2018  2018-09-09  -4
110019000   7A Antepartum   Unit Technician 09/18/2018  2018-09-16  -3.25
110019000   7A Antepartum   Unit Technician 09/25/2018  2018-09-23  3.5
110019000   7A Antepartum   Unit Technician 10/02/2018  2018-09-30  13.38
110019000   7A Antepartum   Unit Technician 10/09/2018  2018-10-07  3.75
110019000   7A Antepartum   Unit Technician 10/16/2018  2018-10-14  -0.5

Полный SQL:

SELECT 

       ID [EmployeeID]
      ,DEPTNAME [Department]
      ,JOBTITLE [Job]
      ,CONVERT(VARCHAR(10),EARNS_END_DT,101) [Apply Date]  
      ,DATEADD(DAY, 2 - DATEPART(WEEKDAY, EARNS_END_DT) , CAST(EARNS_END_DT -1 AS DATE)) AS 'Week Start' -- Adjust the "-2" to set the proper DOW 
      ,36. - SUM(CASE WHEN P.PAYCODECATEGORYFK IN ('REG', 'ABU', 'PTO', 'LEAVE', 'HOL') THEN OTH_HRS ELSE 0 END)  AS 'Unused Capacity'
      ,36. - SUM(CASE WHEN P.PAYCODECATEGORYFK IN ('REG', 'ABU', 'PTO', 'LEAVE', 'HOL') THEN IIF(OTH_HRS <=0, 0, OTH_HRS) ELSE 0 END)  AS 'Unused Capacity'
      ,36. - SUM(CASE WHEN P.PAYCODECATEGORYFK IN ('REG', 'ABU', 'PTO', 'LEAVE', 'HOL') AND OTH_HRS >= 0 THEN OTH_HRS ELSE 0 END)  AS 'Unused Capacity' 

    FROM    
        PAYROLL_DATA D  
        INNER JOIN  PAYCODEMAP P ON P.PAYCODENAME = D.DESCR 

    WHERE EARNS_END_DT BETWEEN '8/28/2018' AND '8/26/2019'

    GROUP BY

       ID
      ,DEPTNAME
      ,JOBTITLE
      ,EARNS_END_DT

    ORDER BY 
        EMPLOYEEID 
        ,[Week Start]

1 Ответ

0 голосов
/ 09 октября 2019

Попробуйте это

Используйте IIF с CASE

SELECT ... ,36. - SUM(CASE WHEN P.PAYCODECATEGORYFK IN ('REG', 'ABU', 'PTO', 'LEAVE', 'HOL') THEN IIF(OTH_HRS<=0, 0,OTH_HRS) ELSE 0 END)  AS 'Unused Capacity' 

ИЛИ

этот Используйте AND в 1 CASE утверждении

SELECT ... ,36. - SUM(CASE WHEN P.PAYCODECATEGORYFK IN ('REG', 'ABU', 'PTO', 'LEAVE', 'HOL') AND OTH_HRS >= 0 THEN OTH_HRS ELSE 0 END)  AS 'Unused Capacity' 

Это пример того, как его использовать, во всех случаях никакие отрицательные значения не возвращались.

Убедитесь, что часть 36-SUM правильна для

 DECLARE @Temp as table (PAYCODECATEGORYFK varchar(3), OTH_HRS int)

 INSERT INTO @Temp VALUES
('REG', 3),
('REG', -4),
('REG', 0),
('PTO', 8),
('PTO', -2),
('PTO', 0),
('AAA', 9),
('BBB', -1),
('CCC', 0)

SELECT  CASE WHEN P.PAYCODECATEGORYFK IN ('REG', 'ABU', 'PTO', 'LEAVE', 'HOL') THEN IIF(OTH_HRS<=0, 0,OTH_HRS) ELSE 0 END   AS 'Unused Capacity' 
 FROM @Temp P

SELECT 36. - SUM(CASE WHEN P.PAYCODECATEGORYFK IN ('REG', 'ABU', 'PTO', 'LEAVE', 'HOL') THEN IIF(OTH_HRS<=0, 0,OTH_HRS) ELSE 0 END)  AS 'Unused Capacity' 
 FROM @Temp P
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...