首页 > 解决方案 > 查询以获取基于多于 1 列的行中的总计

问题描述

鉴于此表布局

primary_status | submitted_total_A | total_paid_A | secondary_status | submitted_total_B | total_paid_B
O              | 100.00            | 0            | C                | 250.00            | 250.00
C              | 150.00            | 150.00       | N                | 0.00                                                                            |  0.00
C              | 300.00            | 0            | O                | 50.00             | 25.00
O              | 400.00            | 50.00        | O                | 500.00            | 100.00

我正在尝试获得 submit_total_A - total_paid_A (当primary_status = 'O')+ submit_total_B - total_paid_B (当secondary_status = 'O')的总和。所以基本上,当任一状态列包含“O”时,相关的“A”和“B”列将包含在新列“row_total”的计算中。

预期结果将是:

*第 1 行“row_total”将为 100.00(仅包括“A”列差异)

*第 2 行“row_total”将为 0.00(状态列均不包含“O”)

*第 3 行“row_total”将为 25.00(仅包括“B”列差异)

*第 4 行“row_total”将为 750.00(包括“A”和“B”列的差异)

这是我的查询,但我知道该值是错误的,因为当任一状态为“O”时,“OR”将同时选择“A”和“B”:

SELECT ( submitted_total_a - total_paid_a + submitted_total_b - total_paid_b ) 
       AS 
       'row_total' 
FROM   table_1 
WHERE  primary_status = 'O' 
        OR secondary_status = 'O'; 

标签: sql

解决方案


SELECT ( CASE 
           WHEN primary_status = 'O' THEN ( submitted_total_a - total_paid_a ) 
           ELSE 0 
         END ) + 
       ( CASE 
           WHEN secondary_status = 'O' THEN ( submitted_total_b - total_paid_b ) 
           ELSE 0 
         END ) row_total 
FROM   table 

的简单使用CASE WHEN,它就像一个[if, else]条件块,相当于switch/casePHP 中的 a


推荐阅读