Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗goSpDbAg 213 of 280 menu
◀ ▶

Агрегаты в запросе в Go

Агрегат сжимает много строк в одно число: сколько записей, какая сумма или среднее по столбцу. Такой запрос удобно читать одной строкой без цикла.

Частые функции это COUNT, SUM и AVG. Результат кладут в переменную через чтение одной строки или через обычный Scan, если агрегатов несколько в одном запросе.

Посчитаем товары и среднюю цену:

package main import ( "database/sql" "fmt" "log" "os" _ "modernc.org/sqlite" ) func main() { os.Remove("shop.db") db, err := sql.Open("sqlite", "shop.db") if err != nil { log.Fatal(err) } defer db.Close() err = db.Ping() if err != nil { log.Fatal(err) } _, err = db.Exec(` CREATE TABLE goods ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, price REAL NOT NULL ) `) if err != nil { log.Fatal(err) } _, err = db.Exec( `INSERT INTO goods (title, price) VALUES (?, ?)`, "pen", 2.0, ) if err != nil { log.Fatal(err) } _, err = db.Exec( `INSERT INTO goods (title, price) VALUES (?, ?)`, "book", 12.0, ) if err != nil { log.Fatal(err) } var count int var avg sql.NullFloat64 err = db.QueryRow( `SELECT COUNT(*), AVG(price) FROM goods`, ).Scan(&count, &avg) if err != nil { log.Fatal(err) } fmt.Println(count, avg.Float64) }

На экране 2 и среднее 7. Для пустой таблицы AVG дала бы пустое значение, поэтому иногда берут тип с флагом Valid.

Сумму по заказам посчитаем отдельно:

package main import ( "database/sql" "fmt" "log" "os" _ "modernc.org/sqlite" ) func main() { os.Remove("shop.db") db, err := sql.Open("sqlite", "shop.db") if err != nil { log.Fatal(err) } defer db.Close() err = db.Ping() if err != nil { log.Fatal(err) } _, err = db.Exec(` CREATE TABLE orders ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, qty INTEGER NOT NULL, price REAL NOT NULL ) `) if err != nil { log.Fatal(err) } _, err = db.Exec( `INSERT INTO orders (title, qty, price) VALUES (?, ?, ?)`, "mug", 3, 9.5, ) if err != nil { log.Fatal(err) } _, err = db.Exec( `INSERT INTO orders (title, qty, price) VALUES (?, ?, ?)`, "pen", 2, 2.0, ) if err != nil { log.Fatal(err) } var total float64 err = db.QueryRow( `SELECT SUM(qty * price) FROM orders`, ).Scan(&total) if err != nil { log.Fatal(err) } fmt.Println(total) }

Даны строки goods:

pen 2 book 12 mug 9

Скажите, что вернет COUNT(*) и SUM(price) без условия.

Дана пустая таблица orders. Скажите, чему равен COUNT(*) и что даст AVG(price).

Нужна общая выручка как сумма qty * price по всем строкам. Составьте текст запроса с SUM.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить