Перейти к основному содержанию
Перейти к основному содержанию

sumIf

Описание

Комбинатор If может быть применён к агрегатной функции sum для вычисления суммы значений по строкам, для которых условие истинно, используя агрегатную функцию-комбинатор sumIf.

Пример использования

В этом примере мы создадим таблицу, которая хранит данные о продажах с флагами успешности, а затем используем sumIf для вычисления общей суммы продаж по успешным транзакциям.

CREATE TABLE sales(
    transaction_id UInt32,
    amount Decimal(10,2),
    is_successful UInt8
) ENGINE = 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 будет суммировать только те значения поля amount, для которых is_successful = 1. В этом случае она просуммирует: 100.50 + 200.75 + 300.00 + 175.25.

   ┌─total_successful_sales─┐
1. │                  776.50 │
   └───────────────────────┘

Расчет торгового объема по направлению движения цены

В этом примере мы используем таблицу stock, доступную в ClickHouse playground, чтобы рассчитать торговый объем по направлению движения цены за первую половину 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;
    ┌──────месяц─┬─объем_в_дни_роста─┬─объем_в_дни_падения─┬─объем_в_нейтральные_дни─┬─общий_объем──┐
 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 миллиард │
    └────────────┴───────────────────┴─────────────────────┴────────────────────────┴───────────────┘

Рассчитать торговый объём по тикеру

В этом примере мы будем использовать таблицу stock, доступную в ClickHouse playground, чтобы посчитать объём торгов по биржевому тикеру в 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 │
    └────────────┴────────────────┴──────────────────┴────────────────┴──────────────┴───────────────────────┘

Смотрите также