Группировка строк в SQL
Конструкция GROUP BY собирает строки с одинаковым значением
колонки в одну группу. Агрегат считают отдельно
для каждой такой группы.
Сумма по коду склада для нескольких партий:
import java.sql.DriverManager
fun main() {
DriverManager.getConnection("jdbc:sqlite:grouped.db")
.use { connection ->
connection.createStatement().use { statement ->
statement.execute(
"""
CREATE TABLE IF NOT EXISTS parcels (
id INTEGER PRIMARY KEY,
zone TEXT NOT NULL,
units INTEGER NOT NULL
)
"""
)
statement.executeUpdate(
"INSERT INTO parcels (zone, units) VALUES ('A', 3)"
)
statement.executeUpdate(
"INSERT INTO parcels (zone, units) VALUES ('A', 5)"
)
statement.executeUpdate(
"INSERT INTO parcels (zone, units) VALUES ('B', 2)"
)
val result = statement.executeQuery(
"""
SELECT zone, SUM(units) AS total
FROM parcels
GROUP BY zone
ORDER BY zone
"""
)
while (result.next()) {
println(result.getString("zone"))
println(result.getInt("total"))
}
}
}
}
В списке SELECT без агрегата могут быть только
поля из GROUP BY. Фильтр по итогу группы
задают через HAVING, а не WHERE:
import java.sql.DriverManager
fun main() {
DriverManager.getConnection("jdbc:sqlite:grouped.db")
.use { connection ->
val result = connection.createStatement()
.executeQuery(
"""
SELECT zone, SUM(units) AS total
FROM parcels
GROUP BY zone
HAVING total >= 5
"""
)
while (result.next()) {
println(result.getString("zone"))
}
}
}
Создайте таблицу pallets в wh.db
с полями aisle и boxes, добавьте
шесть строк и выведите сумму boxes для
каждого aisle.
Оставьте только проходы, где сумма коробок не
меньше 10, и выведите их коды.