我有以下查询给出了销售总额:
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或子查询?
答案 0 :(得分:3)
你可以在求和时应用因子:
SELECT SUM(CASE WHEN currency IN ('jpy', 'aud')
THEN sales * 0.95
ELSE sales
END)
FROM combined
CASE有两种形式。这个检查在WHEN求值为true之后给出的布尔表达式。如果确实如此,它的销售额将减少5%;如果没有,则在ELSE之后返回表达式。你可以组合WHEN ......那么对。第一个计算结果为true的表达式返回表达式。
您可能已按照您在问题中的建议,通过从JPY和AUD中减去TAX来完成此操作,如下所示:
SELECT SUM(sales)
- ifnull (SUM(CASE WHEN currency IN ('jpy', 'aud')
THEN sales * 0.05
END), 0)
FROM combined
但它不会以任何方式帮助查询。
答案 1 :(得分:2)
由于只有两种选择,您还可以使用IF()
功能:
SELECT SUM(sales * IF(currency IN ('jpy', 'aud'), 0.95, 1))
FROM combined
另一种方法是使用隐式布尔转换为0
或1
,如下所示:
SELECT SUM(sales * (1 - currency IN ('jpy', 'aud') * 0.05))
currency IN ('jpy', 'aud')
布尔表达式将隐式转换为0
(错误时)或1
(当为真时),这将导致sales * (1 - 0)
或{{ 1}},相应地。
答案 2 :(得分:1)
select sum(sales) - case when (currency in ('jpy', 'aud') then (Sum(sales) * .05) else 0 end
(TSQL或mysql?)
答案 3 :(得分: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和总计5%的折扣