Сводные функции SQL в SQLite
Агрегаты сжимают множество строк в одно значение.
Число строк считает COUNT, SUM складывает
числа, MIN и MAX берут крайние
значения столбца. Несколько функций можно запросить
в одном SELECT с псевдонимами для чтения
по номерам столбцов:
#include <iostream>
#include <sqlite3.h>
int main() {
sqlite3* db = nullptr;
if (sqlite3_open("stats.db", &db) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
char* err = nullptr;
if (sqlite3_exec(
db,
"CREATE TABLE IF NOT EXISTS loads ("
"id INTEGER PRIMARY KEY,"
"kg INTEGER NOT NULL"
")",
nullptr,
nullptr,
&err
) != SQLITE_OK) {
std::cerr << err << "\n";
sqlite3_free(err);
sqlite3_close(db);
return 1;
}
if (sqlite3_exec(
db,
"INSERT INTO loads (kg) VALUES (10)",
nullptr,
nullptr,
&err
) != SQLITE_OK) {
std::cerr << err << "\n";
sqlite3_free(err);
sqlite3_close(db);
return 1;
}
if (sqlite3_exec(
db,
"INSERT INTO loads (kg) VALUES (25)",
nullptr,
nullptr,
&err
) != SQLITE_OK) {
std::cerr << err << "\n";
sqlite3_free(err);
sqlite3_close(db);
return 1;
}
if (sqlite3_exec(
db,
"INSERT INTO loads (kg) VALUES (15)",
nullptr,
nullptr,
&err
) != SQLITE_OK) {
std::cerr << err << "\n";
sqlite3_free(err);
sqlite3_close(db);
return 1;
}
sqlite3_stmt* stmt = nullptr;
if (sqlite3_prepare_v2(
db,
"SELECT COUNT(*) AS cnt, SUM(kg) AS total, "
"MIN(kg) AS light, MAX(kg) AS heavy FROM loads",
-1,
&stmt,
nullptr
) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
if (sqlite3_step(stmt) == SQLITE_ROW) {
std::cout << sqlite3_column_int(stmt, 0) << "\n";
std::cout << sqlite3_column_int(stmt, 1) << "\n";
std::cout << sqlite3_column_int(stmt, 2) << "\n";
std::cout << sqlite3_column_int(stmt, 3) << "\n";
}
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
Запись COUNT(*) не смотрит на NULL в отдельных
полях - считаются строки целиком. Для пустой таблицы
агрегаты все равно вернут одну строку результата:
#include <iostream>
#include <sqlite3.h>
int main() {
sqlite3* db = nullptr;
if (sqlite3_open("stats.db", &db) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
sqlite3_stmt* stmt = nullptr;
if (sqlite3_prepare_v2(
db,
"SELECT COUNT(*) AS cnt FROM loads",
-1,
&stmt,
nullptr
) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
if (sqlite3_step(stmt) == SQLITE_ROW) {
std::cout << sqlite3_column_int(stmt, 0) << "\n";
}
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
Создайте таблицу fees в club.db
с полем amount, добавьте четыре суммы
и выведите число строк, сумму, минимум и максимум.
Добавьте условие WHERE amount >= ? с
порогом 50 и выведите SUM
только по подходящим строкам.