Группировка строк в SQL
Конструкция GROUP BY собирает строки с одинаковым значением
колонки в одну группу. Агрегат считают отдельно
для каждой такой группы.
Сумма по коду склада для нескольких партий:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Main {
public static void main(String[] args) throws Exception {
try (Connection connection = DriverManager.getConnection("jdbc:sqlite:grouped.db")) {
try (Statement statement = connection.createStatement()) {
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)"
);
ResultSet result = statement.executeQuery(
"""
SELECT zone, SUM(units) AS total
FROM parcels
GROUP BY zone
ORDER BY zone
"""
);
while (result.next()) {
System.out.println(result.getString("zone"));
System.out.println(result.getInt("total"));
}
}
}
}
}
}
В списке SELECT без агрегата могут быть только
поля из GROUP BY. Фильтр по итогу группы
задают через HAVING, а не WHERE:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Main {
public static void main(String[] args) throws Exception {
try (Connection connection = DriverManager.getConnection("jdbc:sqlite:grouped.db")) {
try (Statement statement = connection.createStatement();
ResultSet result = statement.executeQuery("""
SELECT zone, SUM(units) AS total
FROM parcels
GROUP BY zone
HAVING total >= 5
""")) {
while (result.next()) {
System.out.println(result.getString("zone"));
}
}
}
}
}
Создайте таблицу pallets в wh.db
с полями aisle и boxes, добавьте
шесть строк и выведите сумму boxes для
каждого aisle.
Оставьте только проходы, где сумма коробок не
меньше 10, и выведите их коды.