UI設計したり、ウェブシステムを開発したりします。 

SQL見るだけクエリ#033 HAVINGを使って、グループの合計値が500万以上であるグループのみを取得

記入日:2023-02-10 編集日:2023-02-10

SQL見るだけクエリ。今回は、HAVINGを使って、グループの合計が指定数以上のグループのみを取得するSQLを書いてみよと思います。

この記事を読むと(約5分)
SQLを使って特定のグループ分けをし、指定の範囲内のグループのみ取得する方法がわかります。HAVING句を使っておこないます。

具体的に今回取得したい内容は、各空港が属する都道府県毎の国内線利用者数を合計し、500万人以上の都道府県のみを取得しようと思います。


以下の様なテーブルを用意しました。(テーブル名:sql_airport)

                
idairport_codeairport_namepref_codepref_namepassengers_sumdomestic_suminternational_sum
122827羽田空港(東京)13東京都869202936838281118537482
229110成田空港(東京)12千葉県42413928764277934771149
325892関西空港(大阪)27大阪府31807820698177024826050
429655福岡空港40福岡県24679617182815526398065
529654新千歳空港(札幌)1北海道24599263207327443866519
629657那覇空港(沖縄)47沖縄県21761828180809983680830
725856伊丹空港(大阪)27大阪府16504209165042090
829411中部国際空港(名古屋)23愛知県1346014966766236783526
928935鹿児島空港46鹿児島県60752105663539411671
1021045仙台空港4宮城県38553873462344393043
1128628熊本空港43熊本県34921883321313170875
1229656宮崎空港45宮崎県3410361331241697945
1329150神戸空港28兵庫県3362720336267149
1428535長崎空港42長崎県3360170327527084900
1527367広島空港34広島県31665722821076345496
1627893松山空港38愛媛県3152419305496197458
1729116石垣空港47沖縄県2614822251521099612
1827725高松空港37香川県21524301815458336972
1928743大分空港44大分県19823771876887105490
2023691小松空港17石川県18875351653086234449
2129115宮古空港47沖縄県180349018034900
2220443函館空港1北海道18005771632697167880
2328133北九州空港40福岡県17535251450606302919
2427970高知空港39高知県165627916539712308
2527053岡山空港33岡山県16119581312970298988
2621138秋田空港5秋田県1380863136903311830
2720620青森空港2青森県1250569117820572364
2827649徳島空港36徳島県121885212103598493
2924034新潟空港15新潟県12014191063706137713
3020013旭川空港1北海道1158948110951749431
3126923出雲空港32島根県105115510492601895
3227584山口宇部空港35山口県1028166101493913227
3325079名古屋空港23愛知県942753942062691
3429114奄美空港46鹿児島県8919908919900
3520178釧路空港1北海道866970866198772
3620570女満別空港1北海道8604588585001958
3729445茨城空港8茨城県822208653265168943
3829152佐賀空港41佐賀県813082610419202663
3929148静岡空港22静岡県805195488053317142
4020106帯広空港1北海道701557700943614
4127033米子空港31鳥取県69213760479287345
4224723富山空港16富山県575172455614119558
4320908花巻空港3岩手県51674247007646666
4429706岩国空港35山口県5137505137500
4521335庄内空港6山形県4425664370725494
4626881鳥取空港31鳥取県4177404108926848
4721393山形空港6山形県36667833865328025
4820772三沢空港2青森県3095273095270
4921552福島空港7福島県28243725561726820
5020081丘珠空港(札幌)1北海道2774252774250
5129126久米島空港47沖縄県2645242645240
5229119対馬空港42長崎県2576872576870
5320428根室中標津空港1北海道2148752148750
5429113八丈島空港13東京都2135692135690
5529123徳之島空港46鹿児島県2075422075420
5620613稚内空港1北海道2036542036540
5726812南紀白浜空港30和歌山県1821581821580
5829153能登空港17石川県1745441729291615
5929118五島福江空港42長崎県1689741689740
6029147大館能代空港5秋田県1592141592140
6124326松本空港20長野県1558981536762222
6226938萩・石見空港32島根県1527251527250
6329122屋久島空港46鹿児島県1459731459730
6429124沖永良部空港46鹿児島県1196361196360
6530011下地島空港47沖縄県1092469200017246
6629127与那国空港47沖縄県1044631044630
6729141調布飛行場13東京都97041970410
6829128喜界空港46鹿児島県89729897290
6929121種子島空港46鹿児島県88513885130
7029125与論空港46鹿児島県78227782270
7120107オホーツク紋別空港1北海道77299772990
7229117隠岐空港32島根県63732637320
7329135南大東空港47沖縄県47871478710
7429129利尻空港1北海道45183451830
7529136多良間空港47沖縄県44809448090
7629313天草空港43熊本県43982439820
7726436但馬空港28兵庫県42105421050
7829120壱岐空港42長崎県34992349920
7929142新島空港13東京都32343323430
8029112三宅島空港13東京都29163291630
8129111大島空港13東京都24539245390
8229143神津島空港13東京都22638226380
8329134北大東空港47沖縄県21651216510
8429131奥尻空港1北海道11881118810
8530009粟国空港47沖縄県8508500
8630010慶良間空港47沖縄県1931930
8730005小値賀空港42長崎県550
8830007岡南飛行場33岡山県220
8930001礼文空港1北海道000
9030002佐渡空港15新潟県000
9130003福井空港18福井県000
9230004八尾空港27大阪府000
9330006上五島空港42長崎県000
9430008大分県央飛行場44大分県000
9530012伊江島空港47沖縄県000
9630013波照間空港47沖縄県000

テーブルの情報を取得するSQLに関して、注目する部分は、以下の9~13行目です。

SELECT pref_code, pref_name, SUM(domestic_sum)
FROM sql_airport
GROUP BY pref_name
HAVING SUM(domestic_sum) > 5000000
ORDER BY SUM(domestic_sum) DESC

try {
    include_once '../model/class.php';

    // データベース接続
    $database = new Database();
    $db = $database->connect();

    // SQLを準備し、パラメータをバインドする
    $query = 'SELECT pref_code, pref_name, SUM(domestic_sum) 
    FROM sql_airport 
    GROUP BY pref_name
    HAVING SUM(domestic_sum) > 5000000
    ORDER BY SUM(domestic_sum) DESC';
    $stmt = $db->prepare($query);

    // 実行する
    $stmt->execute();

    // 結果を取得する
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    print_r($result);

    // データベースから切断する
    $database->disconnect();

} catch(PDOException $e) {
    echo $e->getMessage();
}

これを実行すると、二次元連想配列という形式で、情報を取得することができます。

            Array
(
    [0] => Array
        (
            [pref_code] => 13
            [pref_name] => 東京都
            [SUM(domestic_sum)] => 68802104
        )

    [1] => Array
        (
            [pref_code] => 1
            [pref_name] => 北海道
            [SUM(domestic_sum)] => 26730916
        )

    [2] => Array
        (
            [pref_code] => 27
            [pref_name] => 大阪府
            [SUM(domestic_sum)] => 23485979
        )

    [3] => Array
        (
            [pref_code] => 47
            [pref_name] => 沖縄県
            [SUM(domestic_sum)] => 22976059
        )

    [4] => Array
        (
            [pref_code] => 40
            [pref_name] => 福岡県
            [SUM(domestic_sum)] => 19732158
        )

    [5] => Array
        (
            [pref_code] => 12
            [pref_name] => 千葉県
            [SUM(domestic_sum)] => 7642779
        )

    [6] => Array
        (
            [pref_code] => 23
            [pref_name] => 愛知県
            [SUM(domestic_sum)] => 7618685
        )

    [7] => Array
        (
            [pref_code] => 46
            [pref_name] => 鹿児島県
            [SUM(domestic_sum)] => 7285149
        )

)
			

見やすくする為に、HTMLとCSSで体裁を整えると、以下のようになります。

都道府県別国内線利用者数
(500万人以上のみ)

pref_code 都道府県名 国内線利用者数合計
13
東京都
68802104
1
北海道
26730916
27
大阪府
23485979
47
沖縄県
22976059
40
福岡県
19732158
12
千葉県
7642779
23
愛知県
7618685
46
鹿児島県
7285149

SQLの使いどころ

サイトに大量の情報を掲載することは、ユーザーにとってとても便利なことです。しかし、情報が多すぎると、目的の情報を見つけるのが困難になります。そのため、SQLを使用することで、情報を効率的に管理することができます。

SQLを使用することで、データベース内の情報を検索したり、フィルタリングしたりすることができます。これにより、ユーザーは目的の情報をスムーズかつ簡単に見つけることができます。

また、SQLを使用することで、データを集計したり、統合したりすることもできます。これにより、ユーザーはさまざまな視点から情報を分析することができます。つまり、サイトに多くの情報を掲載することが重要である一方で、その情報を効率的かつ簡単に管理することが求められる場合には、SQLが不可欠であるといえます。

KK

機械工学を専攻。工業デザイナーとして、国内及び海外の自動車・搬送ラインの設計などに従事した後、2003年にウェブシステム会社を設立。UI設計やウェブシステムの開発、DX化のディレクションなどを行っています。