SQL-不使用GROUP BY的情况下使用CASE

Sam*_*Ham 2 sql sql-server sql-server-2008

如何在不GROUP BY使用CASE表达式的情况下获得值的总和SQL (或请提出实现此目标的其他最佳方法)

查询

SELECT 
    CASE
        WHEN [lab_date] <= '2018-03-24'
             AND [lab_date] >= '2018-01-01'
        THEN(ISNULL(SUM(ISNULL([cost], 0) * 5 / 100), 0))
        WHEN [lab_date] >= '2018-03-25'
        THEN(ISNULL((SUM(ISNULL([cost], 0))) - (SUM(ISNULL([cost], 0) * 5 / 100)), 0))
    END AS [tax]
FROM [LABOR];

+-------------+--------+
|  lab_date   |  cost  |
+-------------+--------+
| 2018-03-12  |  75.00 |
| 2018-03-01  | 150.00 |
| 2018-03-11  | 450.00 |
| 2018-03-13  |  37.50 |
| 2018-03-15  | 150.00 |
+-------------+--------+
Run Code Online (Sandbox Code Playgroud)

在lab_date之前与GROUP取得联系

+-------+
|  tax  |
+-------+
| 15.00 |
| 22.50 |
|  3.75 |
|  1.88 |
+-------+
Run Code Online (Sandbox Code Playgroud)

我们如何获得如下结果

+-------+
|  tax  |
+-------+
| 43.13 |
+-------+
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 5

我认为您需要条件聚合。。。其中的case参数是SUM()

SELECT SUM(CASE WHEN lab_date <= '2018-03-24' AND lab_date >= '2018-01-01' THEN cost * 5.0/100
                WHEN lab_date >= '2018-03-25' THEN cost - cost * 5.0/100
                ELSE 0
           END)  as tax         
FROM LABOR ;
Run Code Online (Sandbox Code Playgroud)

请注意,SQL Server执行整数除法。因此,我建议您不要写5/100,因为这将等于0。即使先执行乘法,也不习惯保留小数点。