sumIf
描述
If 组合器可以应用于 sum
函数,使用 sumIf 聚合组合器函数计算条件为 true 的行的值之和。
示例用法
在这个示例中,我们将创建一个用于存储包含成功标记的销售数据表,
并使用 sumIf 来计算所有成功交易的销售总金额。
创建表 sales(
transaction_id UInt32,
amount Decimal(10,2),
is_successful UInt8
) 引擎 = Log;
INSERT INTO sales VALUES
(1, 100.50, 1),
(2, 200.75, 1),
(3, 150.25, 0),
(4, 300.00, 1),
(5, 250.50, 0),
(6, 175.25, 1);
SELECT
sumIf(amount, is_successful = 1) AS total_successful_sales
FROM sales;
sumIf 函数只会对 is_successful = 1 的记录对应金额进行求和。
在本例中,它会对以下数值求和:100.50 + 200.75 + 300.00 + 175.25。
┌─total_successful_sales─┐
1. │ 776.50 │
└───────────────────────┘
按价格走势计算交易量
在本示例中,我们将使用 ClickHouse playground 中提供的 stock 表,
来计算 2002 年上半年按价格走势划分的交易量。
SELECT
toStartOfMonth(date) AS month,
formatReadableQuantity(sumIf(volume, price > open)) AS 上涨日成交量,
formatReadableQuantity(sumIf(volume, price < open)) AS 下跌日成交量,
formatReadableQuantity(sumIf(volume, price = open)) AS 平盘日成交量,
formatReadableQuantity(sum(volume)) AS 总成交量
FROM stock.stock
WHERE date BETWEEN '2002-01-01' AND '2002-12-31'
GROUP BY month
ORDER BY month;
┌──────month─┬─volume_on_up_days─┬─volume_on_down_days─┬─volume_on_neutral_days─┬─total_volume──┐
1. │ 2002-01-01 │ 26.07 十亿 │ 30.74 十亿 │ 781.80 百万 │ 57.59 十亿 │
2. │ 2002-02-01 │ 20.84 十亿 │ 29.60 十亿 │ 642.36 百万 │ 51.09 十亿 │
3. │ 2002-03-01 │ 28.81 十亿 │ 23.57 十亿 │ 762.60 百万 │ 53.14 十亿 │
4. │ 2002-04-01 │ 24.72 十亿 │ 30.99 十亿 │ 763.92 百万 │ 56.47 十亿 │
5. │ 2002-05-01 │ 25.09 十亿 │ 30.57 十亿 │ 858.57 百万 │ 56.52 十亿 │
6. │ 2002-06-01 │ 29.10 十亿 │ 30.88 十亿 │ 875.71 百万 │ 60.86 十亿 │
7. │ 2002-07-01 │ 32.27 十亿 │ 41.73 十亿 │ 747.32 百万 │ 74.75 十亿 │
8. │ 2002-08-01 │ 28.57 十亿 │ 27.49 十亿 │ 1.17 十亿 │ 57.24 十亿 │
9. │ 2002-09-01 │ 23.37 十亿 │ 31.02 十亿 │ 775.66 百万 │ 55.17 十亿 │
10. │ 2002-10-01 │ 38.57 十亿 │ 34.05 十亿 │ 956.48 百万 │ 73.57 十亿 │
11. │ 2002-11-01 │ 34.90 十亿 │ 25.47 十亿 │ 998.34 百万 │ 61.37 十亿 │
12. │ 2002-12-01 │ 22.99 十亿 │ 28.65 十亿 │ 1.14 十亿 │ 52.79 十亿 │
└────────────┴───────────────────┴─────────────────────┴────────────────────────┴───────────────┘
按股票代码统计成交量
在这个示例中,我们将使用 ClickHouse playground 中提供的 stock 表,
来统计 2006 年三家当时规模最大的科技公司按股票代码划分的交易量。
SELECT
toStartOfMonth(date) AS month,
formatReadableQuantity(sumIf(volume, symbol = 'AAPL')) AS apple_volume,
formatReadableQuantity(sumIf(volume, symbol = 'MSFT')) AS microsoft_volume,
formatReadableQuantity(sumIf(volume, symbol = 'GOOG')) AS google_volume,
sum(volume) AS total_volume,
round(sumIf(volume, symbol IN ('AAPL', 'MSFT', 'GOOG')) / sum(volume) * 100, 2) AS major_tech_percentage
FROM stock.stock
WHERE date BETWEEN '2006-01-01' AND '2006-12-31'
GROUP BY month
ORDER BY month;
┌──────month─┬─apple_volume───┬─microsoft_volume─┬─google_volume──┬─total_volume─┬─major_tech_percentage─┐
1. │ 2006-01-01 │ 782.21百万 │ 1.39十亿 │ 299.69百万 │ 84343937700 │ 2.93 │
2. │ 2006-02-01 │ 670.38百万 │ 1.05十亿 │ 297.65百万 │ 73524748600 │ 2.74 │
3. │ 2006-03-01 │ 744.85百万 │ 1.39十亿 │ 288.36百万 │ 87960830800 │ 2.75 │
4. │ 2006-04-01 │ 718.97百万 │ 1.45十亿 │ 185.65百万 │ 78031719800 │ 3.02 │
5. │ 2006-05-01 │ 557.89百万 │ 2.32十亿 │ 174.94百万 │ 97096584100 │ 3.14 │
6. │ 2006-06-01 │ 641.48百万 │ 1.98十亿 │ 142.55百万 │ 96304086800 │ 2.87 │
7. │ 2006-07-01 │ 624.93百万 │ 1.33十亿 │ 127.74百万 │ 79940921800 │ 2.61 │
8. │ 2006-08-01 │ 639.35百万 │ 1.13十亿 │ 107.16百万 │ 84251753200 │ 2.23 │
9. │ 2006-09-01 │ 633.45百万 │ 1.10十亿 │ 121.72百万 │ 82775234300 │ 2.24 │
10. │ 2006-10-01 │ 514.82百万 │ 1.29十亿 │ 158.90百万 │ 93406712600 │ 2.1 │
11. │ 2006-11-01 │ 494.37百万 │ 1.24十亿 │ 118.49百万 │ 90177365500 │ 2.06 │
12. │ 2006-12-01 │ 603.95百万 │ 1.14十亿 │ 91.77百万 │ 80499584100 │ 2.28 │
└────────────┴────────────────┴──────────────────┴────────────────┴──────────────┴───────────────────────┘