5

我有以下查询,它给了我销售额的总和:

SELECT SUM(sales)
FROM 
    (SELECT sales FROM ...) combined

我现在需要在伪代码中添加基于某些扣除税收的货币的条件减法,如下所示:

SELECT SUM(sales) - (SUM(sales) IF currency IN ('jpy', 'aud') * 0.05)
FROM 
    (SELECT sales FROM ...) combined

我将如何创建这个条件 SUM 或子查询?

4

4 回答 4

3

您可以在求和时应用因子:

SELECT SUM(CASE WHEN currency IN ('jpy', 'aud') 
                THEN sales * 0.95
                ELSE sales
            END)
FROM combined

CASE有两种形式。这个检查是否在 WHEN 评估为 true 之后给出的布尔表达式。如果是这样,它返回的销售额减少了 5%;如果不是,则在 ELSE 之后返回表达式。您可以组合 WHEN...THEN 对。第一个计算结果为 true 的表达式在 THEN 之后返回表达式。

您可能已经按照您在问题中的建议执行此操作,方法是从 JPY 和 AUD 中减去 TAX,如下所示:

SELECT SUM(sales) 
     - ifnull (SUM(CASE WHEN currency IN ('jpy', 'aud') 
                        THEN sales * 0.05
                    END), 0)
FROM combined

但这对查询没有任何帮助。

于 2012-06-03T19:46:55.783 回答
2

由于只有两种选择,您还可以使用该IF()功能:

SELECT SUM(sales * IF(currency IN ('jpy', 'aud'), 0.95, 1))
FROM combined

另一种方法是使用隐式布尔转换为01像这样:

SELECT SUM(sales * (1 - currency IN ('jpy', 'aud') * 0.05))

布尔表达式将currency IN ('jpy', 'aud')隐式转换为0(当为假时)或1(当为真),相应地,这将导致结果为sales * (1 - 0)or sales * (1 - 0.05)

于 2012-06-03T20:00:25.403 回答
1
select sum(sales) - case when (currency in ('jpy', 'aud') then (Sum(sales) * .05) else 0 end

(TSQL 还是 mysql?)

于 2012-06-03T19:33:52.330 回答
1

我认为亚历克斯是正确的。我假设您不能混合使用 jpy 和 usd 等,因此需要按货币分组,即

SELECT currency, 
       SUM(sales) * (1 - CASE WHEN currency IN ('jpy', 'aud') 
                            THEN .05 -- 5% Tax
                         ELSE 
                            0 -- No tax
                         END)
FROM
(
    SELECT 'aud' as currency, 10.00 as sales
    UNION 
    SELECT 'usd' as currency, 20.00 as sales
    UNION
    SELECT 'gbp' as currency, 30.00 as sales
    UNION 
    SELECT 'jpy' as currency, 40.00 as sales
) salesdata
GROUP BY currency

退货

aud 9.50
gbp 30.00
jpy 38.00
usd 20.00

jpy 和 aud 总额减 5%

于 2012-06-03T19:42:51.870 回答