計算機科学のブログ

SQL - SQLite - Python - 高度なSELECT文 - 新たな目でデータを見る - SUM(合計), GROUP BY, AVG(平均), MIN(最小), MAX(最大)

Head First SQL ―頭とからだで覚えるSQLの基本Lynn Beighley(著)、 佐藤 直生(監訳)、 松永 多苗子(翻訳)、 オライリージャパンの 6章(高度なSELECT文 - 新たな目でデータを見る)、p.265(エクササイズ, 気楽にやってみよう)の解答を求めてみる。

schema8_0.sql

select sum(sales)
from cookie_sales
where first_name = 'ニコール';

schema8_1.sql

select first_name, sum(sales)
from cookie_sales
group by first_name
order by sum(sales) desc;

schema8_2.sql

select first_name, avg(sales)
from cookie_sales
group by first_name;

schema8_3.sql

select first_name, max(sales)
from cookie_sales
group by first_name;

schema8_4.sql

select first_name, min(sales)
from cookie_sales
group by first_name;

コード

sample8.py

#! /usr/bin/env python3
import sqlite3

con = sqlite3.connect('sample.db')
cur = con.cursor()

for i in range(5):
    with open(f'schema8_{i}.sql') as f:
        cur.execute(f.read())
    if (d := cur.description) is not None:
        print([t[0] for t in d])
        for row in cur.fetchall():
            print(row)

cur.close()
con.close()

入出力結果(Terminal, Zsh)

% ./sample8.py
['sum(sales)']
(96.03,)
['first_name', 'sum(sales)']
('ブリトニー', 107.91)
('パリス', 98.23)
('ニコール', 96.03)
('リンゼイ', 81.08)
['first_name', 'avg(sales)']
('ニコール', 13.718571428571428)
('パリス', 14.032857142857143)
('ブリトニー', 15.415714285714285)
('リンゼイ', 11.582857142857142)
['first_name', 'max(sales)']
('ニコール', 26.82)
('パリス', 31.99)
('ブリトニー', 43.21)
('リンゼイ', 32.02)
['first_name', 'min(sales)']
('ニコール', 0.0)
('パリス', 0.0)
('ブリトニー', 2.58)
('リンゼイ', 0.0)
%