如果<= 0,则为0,并带有CASE语句

时间:2019-10-08 22:26:47

标签: sql sql-server

正在使用SQL Server。...

我从一个固定值开始,然后减去特定的小时数类型。我最终得到一些负数和一些正数。到目前为止,还不错,但是我需要的是如果值<= 0,那么我想将值设置为0,但语法不正确。任何帮助将不胜感激。

... ,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 :(得分:0)

尝试一下

numnum一起使用

void swap(ELEMENT* e1, ELEMENT* e2)
{
         int tmp = e1->key;
         e1->key = e2->key;
         e2->key = tmp;
}
void constructMinHeap(ELEMENT arr[], int size, int num){

    int left = leftNode(num);
    int right = rightNode(num);
    int min = num;

    if (left < size && arr[left].key   < arr[min].key){
        min = left;
    }

    if (right < size && arr[right].key < arr[min].key){
        min = right;
    }

    if(min != num)
    {
        swap(&arr[num], &arr[min]);
        constructMinHeap(arr, size, min);
    }
}

OR

这一个 在1条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部分是正确的选择

CASE