❄️

Frosty Friday Week122 Easy Group by grouping sets

こんにちは! がく@ちゅらデータエンジニアです。

https://qiita.com/advent-calendar/2024/frostyfriday

こちらの7日目の記事になります。

Frosty Friday Week122 Easy Group by grouping sets

https://frostyfriday.org/blog/2024/12/06/week-122-easy/

こちらのチャレンジになります。
※難易度のBasicとEasyが混在してるのが気になるなぁ・・・w
※どうも、ソフィア・ピエリニさんが作ってるお題の場合は、Easyになってるかもしれない

Week122のチャレンジ内容

あなたは、多様なコースとプログラムで有名な名門校Dynamic Data Academyの SQL エキスパートに任命されました。職務の一環として、大学の Snowflake データベースに保存されている入学登録データを分析する任務を負っています。テーブル構造は次のとおりです。

各コースと期間ごとにグループ化された学生の総数を個別にカウントするにはどうすればよいですか?
ヒント: GROUP BY GROUPING SETSについて聞いたことがありますか?

GROUP BY GROUPING SETSを使ってね!ってことですね

GROUP BY GROUPING SETSについて

https://docs.snowflake.com/ja/sql-reference/constructs/group-by-grouping-sets

GROUP BY GROUPING SETS は、 GROUP BY 句の強力な拡張機能であり、1つのステートメントで複数のgroup-by句を計算します。グループセットは、一連のディメンション列です。

GROUP BY GROUPING SETS は、同じ結果セット内の2つ以上の GROUP BY 操作の UNION と同等です。

環境設定

use role sysadmin;
use warehouse gaku_wh;
use database frosty_friday;
create or replace schema week122;

いつものように、ロール、ウェアハウス、データベースを設定し、使用するSchemaを作っていきます。

次にセットアップスクリプトを流します。

CREATE TABLE student_enroll_info (
    student_id INT PRIMARY KEY,
    course VARCHAR(50),
    duration VARCHAR(50)
);

-- Step 2: Insert data into the table
INSERT INTO student_enroll_info (student_id, course, duration) VALUES
(1, 'CSE', 'Four Years'),
(2, 'EEE', 'Three Years'),
(3, 'CSE', 'Four Years'),
(4, 'MSC', 'Three Years'),
(5, 'BSC', 'Three Years'),
(6, 'Mech', 'Four Years');

select * from student_enroll_info;

GROUP BY GROUPING SETSを使ってみる

お題には「各コースと期間ごとにグループ化された学生の総数を個別にカウントするにはどうすればよいですか?」とあります。
Google翻訳を使ったので、ちょっとわかりにくいですが
-「コース名」でのカウント

  • 「期間」でのカウント
    をやりたい
select course, count(*) from student_enroll_info group by course;

select duration, count(*) from student_enroll_info group by duration;

なので、これをUnionすれば、いいはず

select course, count(*) from student_enroll_info group by course
union all 
select duration, count(*) from student_enroll_info group by duration;

これを、GROUP BY GROUPING Setsで書いてみると・・・

select 
    count(*)
    , course
    , duration 
from 
    student_enroll_info
group by grouping sets (course, duration)
;

この様になりました!

ちなみに、grouing setsをはずしてみると

select 
    count(*)
    , course
    , duration 
from 
    student_enroll_info
group by course, duration
;

ちょっとお題の意図とは変わってしまいますね

まとめ

GROUP BYの拡張である GROUP BY GROUPING SETSを使うお題でした。
余り使う場面はないかもなーと思いつつ、数が多くなるとすごくめんどくさいですしね
GROUPING SETSを入れる場合と入れない場合の出力の差(意図の差)が面白かったです。

こちらのコードは

https://github.com/gakut12/Frosty-Friday/blob/main/Week122_easy_group_by_grouping_sets/week122.sql

にて公開しています。

ちゅらデータ株式会社

Discussion