SQL-使用 CASE 而不使用 GROUP BY

标签 sql sql-server sql-server-2008

如何在 SQL 中使用 CASE 表达式在不使用 GROUP BY 的情况下获取值的总和 (或者请建议实现此目的的任何其他最佳方法)

查询:

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

在 lab_date 之前通过 GROUP 获取此内容

+-------+
|  tax  |
+-------+
| 15.00 |
| 22.50 |
|  3.75 |
|  1.88 |
+-------+

我们如何得到如下结果

+-------+
|  tax  |
+-------+
| 43.13 |
+-------+

最佳答案

我认为你想要条件聚合。 。 。其中 caseSUM() 的参数:

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 ;

请注意,SQL Server 执行整数除法。所以我不建议写 5/100,因为它的计算结果为 0。即使先进行乘法,不包括小数点也是一个坏习惯。

关于SQL-使用 CASE 而不使用 GROUP BY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49876493/

相关文章:

sql - 名为 'Key' 的 SubSonic 列

php - 如何在php中获取mssql的下一个增量数?

SQL Server 2000 - "Actual Number of Rows"到底是什么?

sql-server-2008 - 计算列何时更新?

sql - 在 SQL 表的每一行中查找最后一个 NOT NULL 列的值

c# - 将 SQL 2008 DB R2 恢复到 SQL 2008(不是 r2)

sql - 在事务中执行语句 - Sql Server 2005

mysql - MySQL 有没有办法将查询所花费的时间包含在结果表中?

SQL XML 创建 xml 树(父子)的显式问题

sql - 将值从范围插入表中