人口増加率分析

人口増加率分析

難易度3となるこの問題は、先の問題と同様にテーブル結合を利用しますが、同じテーブルを結合(自己結合)して、調査年毎に総人口を取得しています。

【問題】

【使用テーブル】

【解答例】

SELECT
    PO.PF_CODE AS 都道府県コード
    , PF.PF_NAME AS 都道府県名
    , PO.TOTAL_AMT AS 総人口2015年
    , PO2020.TOTAL_AMT AS 総人口2020年
    , ROUND(  -- ①
            CAST(PO2020.TOTAL_AMT AS REAL)  -- ②
 / CAST(PO.TOTAL_AMT AS REAL) * 100
    )  AS 人口増加率 
FROM
    POPU_TRANSITION AS PO  -- ③
    INNER JOIN PREFECTURE AS PF  -- ④
        ON PF.PF_CODE = PO.PF_CODE 
    INNER JOIN POPU_TRANSITION AS PO2020  -- ⑤
        ON PO2020.PF_CODE = PO.PF_CODE
        AND PO2020.SURVEY_YEAR = 2020  -- ⑤
WHERE
    PO.SURVEY_YEAR = 2015  -- ②
    AND  PO2020.TOTAL_AMT >= PO.TOTAL_AMT  -- ⑥
ORDER BY  -- ⑦
    人口増加率 DESC
    , 都道府県コード ASC;

【解説】
①人口増加率の小数点以下は四捨五入なので、ROUND関数のパラメータは指定していません
②先程と同様に小数点の計算を行うため、INTEGER型(符号付整数)の計算項目をREAL型(不動小数点数)に変換して計算しています
③メインテーブルで調査年が2015年のデータを取得しています
④都道府県名を取得するため、内部結合で都道府県テーブルを結合しています
⑤もう1つの内部結合で、メインテーブルと同じ人口推移テーブルを結合して調査年が2020年のデータを取得しています。どちらのテーブルの項目か判断できるように、AS句を使用して違う名称にしています
⑥人口が増加した都道府県を抽出するために、WHERE句でメインテーブルから取得した2015年の総人口と内部結合で取得した2020年の総人口を比較しています
⑦表示順は、降順と昇順が混ざっているので注意してください

【解答記入】

【コードテスト結果】

年齢別睡眠時間分析

それでは最後の問題、難易度4にチャレンジしてみましょう。問題に登場してくる睡眠時間詳細データのように、縦持ちのデータを表形式にする場合によく利用される方法なので、ぜひ覚えてください。

【問題】

【使用テーブル】

【解答例】

SELECT 
    AGE_GRP.AGE_NAME AS 年齢階層,
    SUM(  -- ④
CASE WHEN TIME_CODE = 120  -- ①
THEN TARGET_POP
ELSE 0 END
) AS "5時間未満",  -- ②
    SUM(CASE WHEN TIME_CODE = 130 THEN TARGET_POP ELSE 0 END)
 AS "5時間以上6時間未満",
    SUM(CASE WHEN TIME_CODE = 140 THEN TARGET_POP ELSE 0 END)
 AS "6時間以上7時間未満",
    SUM(CASE WHEN TIME_CODE = 150 THEN TARGET_POP ELSE 0 END)
 AS "7時間以上8時間未満",
    SUM(CASE WHEN TIME_CODE = 160 THEN TARGET_POP ELSE 0 END)
 AS "8時間以上9時間未満",
    SUM(CASE WHEN TIME_CODE = 170 THEN TARGET_POP ELSE 0 END)
 AS "9時間以上",
    SUM(CASE WHEN TIME_CODE = 180 THEN TARGET_POP ELSE 0 END)
 AS 不詳
FROM SLEEP_TIME_DTL
INNER JOIN AGE_GRP  -- ③
ON AGE_GRP.AGE_CODE = SLEEP_TIME_DTL.AGE_CODE
GROUP BY AGE_GRP.AGE_CODE  -- ④
ORDER BY AGE_GRP.AGE_CODE;

【解説】
①CASE句を用いて、時間コードの値で対象人数を対応するカラムに振分けます。時間コードが条件外の場合はゼロをセットしています
②AS句で変更している表示項目名の先頭が数字の場合は、ダブルクォーテーションで項目名を囲む必要があるので注意しましょう
③年齢階層名を取得するために、年齢階層テーブルを内部結合しています。
④年齢コードでグルーピングを行い、振分けた値をサマリして表示します

【解答記入】

【コードテスト結果】

上記の解説ではちょっと分りにくいと思いますので、下記のSELECT文でグルーピングする前の状態を見てみましょう(SUM関数とGROUP BY句がない状態です)。

SELECT
    AGE_GRP.AGE_NAME AS 年齢階層,
(CASE WHEN TIME_CODE = 120
THEN TARGET_POP
ELSE 0 END
) AS "5時間未満",
    (CASE WHEN TIME_CODE = 130 THEN TARGET_POP ELSE 0 END)
 AS "5時間以上6時間未満",
    (CASE WHEN TIME_CODE = 140 THEN TARGET_POP ELSE 0 END)
 AS "6時間以上7時間未満",
    (CASE WHEN TIME_CODE = 150 THEN TARGET_POP ELSE 0 END)
 AS "7時間以上8時間未満",
    (CASE WHEN TIME_CODE = 160 THEN TARGET_POP ELSE 0 END)
 AS "8時間以上9時間未満",
    (CASE WHEN TIME_CODE = 170 THEN TARGET_POP ELSE 0 END)
 AS "9時間以上",
    (CASE WHEN TIME_CODE = 180 THEN TARGET_POP ELSE 0 END)
 AS 不詳
FROM SLEEP_TIME_DTL
INNER JOIN AGE_GRP
ON AGE_GRP.AGE_CODE = SLEEP_TIME_DTL.AGE_CODE
ORDER BY AGE_GRP.AGE_CODE;

【グルーピング前】

【サンプルデータ】

【グルーピング前実行結果】

睡眠時間詳細データの1レコード毎の対象人数が、年齢階層と睡眠時間に振り分けられていることが確認できます。この結果を年齢階層で集計することにより、最終的に表示フォーマット例のように表形式で表示できます。それほど難しい関数等を使用していないので、実装方法さえ覚えてしまえば色々と活用できると思います。

おわりに

TOPSIC SQL CONTEST(TSC)の練習問題はいかがでしたか。ここまでSQL-BOOTCAMPでしっかり訓練をしてきた皆さんにとっては、朝飯前だったかも知れませんね! 過去のTSCの問題には強敵も待ち構えているので、ぜひ自信と勇気を持って挑んでみてください。

さて、10回に渡って行ってきたSQL-BOOTCAMPも、今回で最終回となります。皆さんと一緒にSQLの魅力を学べたことを嬉しく思います。本連載が皆さんの力になれば幸いです。これからの皆さんのご活躍を心から応援しています。

そして、最後の紹介です! 今までに習得したSQLの腕試しができるオンラインコンテスト「TOPSIC SQL CONTEST(TSC)」。簡単な会員登録をするだけで、だれでも無料でコンテストに参加できます。コンテストは不定期に開催されますが、過去のコンテスト問題も解答できます。

TOPSIC SQL CONTEST(TSC)サイト内にある、下記のアイコンから会員登録ができます。

それでは、またどこかでお会いしましょう!

この記事のキーワード :

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30