概要: SQLのGROUP BY句と集計関数は、データの集約と分析に不可欠な機能です。本記事では、その基本的な使い方から複数条件でのグループ化、合計値の算出、連番の付与まで、実践的なテクニックを解説します。データ分析の幅を広げ、ビジネス課題解決に貢献するスキルを習得しましょう。
SQLのGROUP BYと集計関数:データの集約と分析を極める全体像
データ分析を加速させるSQLの重要性
現代ビジネスにおいて、DX(デジタルトランスフォーメーション)の加速は目覚ましく、あらゆるビジネスパーソンにとって「データを収集・分析し、ビジネスに活かす力」は不可欠な能力となっています。顧客の行動パターン、市場トレンド、製品のパフォーマンスなど、データから得られるインサイトは、企業の競争力を左右する重要な要素です。このデータ主導の意思決定を支える基盤技術こそが、SQL(Structured Query Language)です。
SQLは50年以上前に誕生したにもかかわらず、現在もデータ抽出・操作の標準言語として確固たる地位を築いています。データベースから必要な情報を効率的に引き出し、加工する能力は、もはやエンジニアだけのものではありません。営業、マーケティング、経営企画といった非エンジニア職においても、自らデータを分析し、迅速かつ根拠に基づいた意思決定を行うための強力な武器となります。複雑なデータもSQLを使えば、簡潔なクエリで目的の情報を手に入れることが可能です。
このような背景から、SQLの習得は個人のキャリアアップにも直結します。日本国内におけるデータサイエンティスト職の求人数は、2016年4月から2021年1月の5年間で7倍以上に増加しており(PRTIMES)、経済産業省の推計では2030年までにIT人材が最大で約54万人不足すると予測されています。この需要の高い市場において、SQLスキルはキャリアの選択肢を広げ、労働市場での競争力を高める重要な要素となるでしょう。
SQLスキルは現代ビジネスで不可欠なデータ分析能力を支え、非エンジニア職にも必須の武器となりつつあります。データサイエンティスト職の需要は5年で7倍以上増加し(PRTIMES)、IT人材不足も予測される中(経済産業省)、SQL習得は市場価値を高め、キャリアアップに直結すると言えるでしょう。
なぜGROUP BYと集計関数が分析の要となるのか
データ分析を行う上で、単に大量のデータを一覧するだけでは意味のある情報は得られにくいものです。ここで本記事の主役であるSQLのGROUP BY句と集計関数が真価を発揮します。GROUP BY句は、指定した項目(カラム)ごとにデータをグループ化し、まとまった塊として集計を行うための句です。これにより、個々のトランザクションデータから「部門別の売上合計」「製品カテゴリごとの平均購入額」「顧客ランク別の注文数」といった、より高次元で実用的な情報を引き出すことが可能になります。
GROUP BY句と組み合わせて使う集計関数には、様々な種類があります。例えば、COUNTはグループ内のレコード数を数え、SUMは合計値を算出します。AVGは平均値を、MAXとMINはそれぞれ最大値と最小値を特定するために使用されます。これらの関数を適切に組み合わせることで、膨大な生データをそのまま見るのではなく、「分析可能な情報」へと変換し、ビジネス上の具体的な課題解決や意思決定に役立てることができるのです。
例えば、ある店舗の売上データがあったとして、単に「いつ、どの商品が、いくらで売れたか」の一覧を見るだけでは、どの商品が人気で、どの時間帯に売れる傾向があるか、といった傾向は掴みにくいでしょう。しかし、GROUP BY product_categoryとしてSUM(sales_amount)を使えば、カテゴリごとの売上貢献度が明確になります。また、GROUP BY sales_dateとしてCOUNT(order_id)を使えば、日々の注文数の推移を把握し、イベントやプロモーションの効果を測定する手がかりを得られます。このように、GROUP BYと集計関数は、データの奥に隠されたパターンやトレンドを浮き彫りにし、データ分析を深化させるための強力なツールなのです。
SQLスキルの市場価値とキャリアアップへの影響
SQLスキルの習得は、現代の労働市場において高い市場価値を持ち、個人のキャリア形成に大きな影響を与えます。データサイエンティスト、データエンジニア、データベース管理者といった専門職はもちろんのこと、ビジネスアナリスト、マーケター、営業企画職など、幅広い職種でデータに基づいた意思決定が求められる現在、SQLは「共通言語」としての役割を担っています。
Stack Overflow Developer Survey 2024によると、全プロフェッショナル開発者の約52%が実務でSQLを使用しており、その普及率は非常に高いことが伺えます。これは、SQLが特定の技術スタックに限定されず、多様なシステムやアプリケーションのバックエンドで広く活用されている証拠です。また、厚生労働省の統計によれば、ITエンジニアの新規有効求人倍率は2026年4月時点で2.6倍と、依然として高い需要が続いています。
SQLを習得することは、単に技術的なスキルセットを増やすだけでなく、「データを読み解く力」「論理的に思考し問題を解決する力」を養うことにも繋がります。これにより、既存の職務における生産性や意思決定の質が向上するだけでなく、データ関連職種へのキャリアチェンジや、より高度なデータ分析ツール(Python、Rなど)の学習への足がかりともなります。SQLは、変化の激しい現代において、長期的に活用できる普遍的なスキルであり、キャリアの柔軟性と成長性を高める上で非常に有効な投資と言えるでしょう。
出典:PRTIMES、経済産業省、Stack Overflow Developer Survey 2024、厚生労働省
基本から応用まで:GROUP BY句と集計関数の実践ステップ
基本ステップ:SQLクエリの構築手順
SQLのGROUP BY句と集計関数を用いたデータ分析は、いくつかの基本的なステップで構成されます。まず、分析したい情報が格納されているテーブルと、そこから取得したい列、そしてどのように集計したいかを明確に定義することが重要です。このプロセスは、以下の4つの主要な句を順番に組み立てることで進められます。
SELECT句で取得対象の列や集計を指定: ここで、グループ化の基準となる列(例:product_category)と、そのグループに対して実行する集計関数(例:SUM(sales_amount))を指定します。FROM句で対象のテーブルを指定: 分析対象のデータが格納されているテーブル名を指定します(例:FROM sales_data)。GROUP BY句で集約の単位を指定:SELECT句で指定したグループ化の基準となる列を、GROUP BY句にも記述します(例:GROUP BY product_category)。これにより、指定した列の値が同じレコード同士が一つのグループとして扱われます。HAVING句でグループ化した結果を絞り込み(必要に応じて): これはオプションですが、集計関数によって得られた結果に対してさらに条件を適用したい場合に用います。例えば、「合計売上が10000円以上のカテゴリのみ表示する」といった条件です。
これらのステップを理解し、順序通りにクエリを構築することが、正確なデータ集計への第一歩となります。例えば、「製品カテゴリごとの総売上」を算出する基本的なクエリは、次のように書くことができます。
SELECT product_category, SUM(sales_amount) AS total_sales
FROM sales_data
GROUP BY product_category;
このクエリは、sales_dataテーブルからproduct_categoryごとにsales_amountを合計し、その結果をtotal_salesという新しい列名で表示します。
主要な集計関数とその使い方
SQLの集計関数は、データの塊から特定の統計量や情報を引き出すために不可欠です。これらを使いこなすことで、生データからは見えないインサイトを可視化できます。主な集計関数は以下の通りです。
COUNT(): 指定した列の非NULL値の数を数えます。COUNT(*)とすると、NULL値を含む全ての行の数を数えることができます。例えば、COUNT(order_id)で注文数を、COUNT(DISTINCT customer_id)でユニークな顧客数を把握できます。SUM(): 指定した数値列の合計値を計算します。例えば、SUM(price * quantity)で総売上を、SUM(discount_amount)で割引総額を算出できます。AVG(): 指定した数値列の平均値を計算します。AVG(unit_price)で平均単価を、AVG(rating)で平均評価点を出す際に役立ちます。MAX(): 指定した列の最大値を返します。数値、日付、文字列など、比較可能なデータ型に対して使用できます。MAX(order_date)で最新の注文日を、MAX(sales_amount)で最大売上を特定できます。MIN(): 指定した列の最小値を返します。MIN(order_date)で最も古い注文日を、MIN(sales_amount)で最小売上を特定できます。
これらの関数をGROUP BY句と組み合わせることで、多様な分析が可能になります。例えば、「各部門の総売上、平均単価、最大売上、最小売上」を一度に取得したい場合は、以下のように記述します。
SELECT
department,
SUM(sales_amount) AS total_sales,
AVG(unit_price) AS avg_unit_price,
MAX(sales_amount) AS max_sales,
MIN(sales_amount) AS min_sales
FROM sales_data
GROUP BY department;
各集計関数の特性を理解し、目的に合わせて適切に使い分けることが、効果的なデータ分析の鍵となります。
- COUNT(): 件数(非NULL値)
- SUM(): 合計値
- AVG(): 平均値
- MAX(): 最大値
- MIN(): 最小値
これらの関数をGROUP BYと組み合わせることで、データの集約と多角的な分析が可能になります。
HAVING句で集計結果をさらに絞り込む
GROUP BY句でデータをグループ化した後、その集計結果に対して特定の条件を適用したい場合があります。このような場合に活用するのがHAVING句です。WHERE句と似ていますが、HAVING句は「グループ化された後の集計結果」に対して条件を指定するという点で大きく異なります。一方、WHERE句は「グループ化する前」の個々の行データに対して条件を適用し、対象となる行を絞り込みます。
例えば、「部門別の総売上を計算し、その中で総売上が50000円以上の部門だけを表示したい」という要件があったとします。この場合、SUM(sales_amount)という集計結果に対して条件を適用するため、HAVING句を使用します。
SELECT
department,
SUM(sales_amount) AS total_sales
FROM sales_data
GROUP BY department
HAVING SUM(sales_amount) >= 50000;
このクエリはまず、sales_dataテーブルをdepartmentごとにグループ化し、各部門のtotal_salesを計算します。その後、計算されたtotal_salesが50000円以上のグループのみを結果として返します。もしWHERE SUM(sales_amount) >= 50000と記述した場合、これはSQLの構文エラーとなるか、意図しない結果を招く可能性があります。
WHERE句は元のテーブルの列に対して直接条件を適用し、HAVING句は集計関数が適用された結果の列(またはその計算結果)に対して条件を適用するという原則を理解することが、正確なデータ分析を行う上で非常に重要です。両者の役割を明確に区別することで、より柔軟かつ高度なデータフィルタリングが可能になります。
目的別で学ぶSQLグループ化:複雑な集計もこなす実践テンプレ集
日別・月別集計でトレンドを把握する
ビジネスのトレンドを把握するためには、時間軸に沿った集計が非常に有効です。SQLのGROUP BY句は、日付や時刻の情報を利用して、日別、週別、月別、年別といった単位でデータを集約するのに役立ちます。これにより、売上の季節性、顧客行動の変化、特定のイベントの効果などを明確に分析できます。
例えば、「日別の総売上」を算出したい場合、日付型のカラムを使用し、以下のようにクエリを記述します。データベースの種類によって日付関数の構文は異なりますが、一般的なアプローチを示します。
-- 日別集計の例 (PostgreSQL/MySQLの場合)
SELECT
DATE(order_date) AS sales_day,
SUM(amount) AS daily_total_sales
FROM orders
GROUP BY DATE(order_date)
ORDER BY sales_day;
-- 月別集計の例 (PostgreSQL/MySQLの場合)
SELECT
DATE_FORMAT(order_date, '%Y-%m') AS sales_month,
SUM(amount) AS monthly_total_sales
FROM orders
GROUP BY sales_month
ORDER BY sales_month;
DATE()関数やDATE_FORMAT()関数(またはTRUNC()、EXTRACT()など、データベースに合わせた関数)を使って日付カラムを特定の粒度に丸めることで、GROUP BYの単位を作成します。これにより、時間経過に伴うデータの増減や傾向を簡単に視覚化し、ビジネス戦略の立案に役立てることが可能になります。例えば、特定の月に売上が急増している、曜日によってアクセス数が大きく異なる、といったインサイトを発見できるでしょう。
複数カラムでのグループ化:多角的な分析を可能にする
単一のカラムでグループ化するだけでは捉えきれない、より複雑なビジネスの実態を分析したい場合、GROUP BY句に複数のカラムを指定することで、多角的な視点からデータを集計できます。これにより、異なる属性間の相互作用や、より詳細なセグメントごとのパフォーマンスを把握することが可能になります。
例えば、「地域別」かつ「製品カテゴリ別」の売上合計を知りたい場合、GROUP BY句にregionとproduct_categoryの両方を指定します。これにより、各地域における各製品カテゴリのパフォーマンスを同時に比較分析できます。
SELECT
region,
product_category,
SUM(sales_amount) AS total_sales
FROM sales_data
GROUP BY region, product_category
ORDER BY region, total_sales DESC;
このクエリは、まずregionでデータをグループ化し、その各region内でさらにproduct_categoryごとにグループ化します。結果として、「関東地域の電化製品」「関西地域の食品」といった具合に、細分化された集計結果が得られます。この情報は、地域ごとのマーケティング戦略の調整や、特定のカテゴリに特化した販促活動の検討に非常に有用です。複数のカラムを組み合わせることで、顧客セグメンテーションや市場のニッチなニーズの特定など、より詳細な分析アプローチが可能となり、ビジネス課題の深掘りに貢献します。
条件付き集計:CASE文と集計関数の組み合わせ
特定の条件に基づいてデータの一部だけを集計したり、異なる条件の結果を一つのクエリで並べて表示したりしたい場合、SQLのCASE文と集計関数を組み合わせる方法が非常に強力です。CASE文は、条件に応じて異なる値を返すことができるため、これを集計関数の引数として利用することで、柔軟な条件付き集計を実現できます。
例えば、「各製品カテゴリにおける、男性顧客と女性顧客それぞれの総購入額」を比較したい場合を考えます。この要件では、顧客の性別という条件に基づいて売上を集計し、それをカテゴリごとに表示する必要があります。
SELECT
product_category,
SUM(CASE WHEN customer_gender = 'Male' THEN purchase_amount ELSE 0 END) AS male_purchase,
SUM(CASE WHEN customer_gender = 'Female' THEN purchase_amount ELSE 0 END) AS female_purchase,
SUM(purchase_amount) AS total_purchase
FROM orders
GROUP BY product_category
ORDER BY product_category;
このクエリでは、SUM関数の中にCASE文がネストされています。customer_genderが’Male’の場合にのみpurchase_amountを加算し、それ以外の場合は0を加算することで、男性顧客の購入額のみを合計します。同様に、女性顧客の購入額も集計します。これにより、一つの結果セットで男性と女性それぞれの購入額を比較でき、カテゴリごとの性別の購買傾向を分析することが可能になります。
CASE文と集計関数の組み合わせは、A/Bテストの結果分析、KPIの達成度評価(例: 特定期間内の達成と未達成の件数)、複数の条件に基づくセグメント分析など、多岐にわたる複雑な集計要件に対応できる汎用性の高いテクニックです。この方法を習得することで、より高度で実用的なデータ分析が可能となるでしょう。
SQLグループ化で陥りがちな落とし穴と効果的な回避策
WHERE句とHAVING句の使い分けをマスターする
SQLのWHERE句とHAVING句は、どちらもデータを絞り込むために使われますが、適用されるタイミングと対象が大きく異なります。この違いを正確に理解していないと、意図しない結果を招いたり、クエリがエラーになったりする「落とし穴」にはまることがあります。
WHERE句:FROM句の直後に評価され、「グループ化する前の個々の行データ」に対して条件を適用します。集計関数をWHERE句の条件として直接使用することはできません。例えば、「特定の地域(region)の売上データだけを対象にしたい」という場合はWHERE region = 'Tokyo'のように使用します。HAVING句:GROUP BY句の後に評価され、「グループ化された後の集計結果」に対して条件を適用します。ここでは、SUM()やCOUNT()などの集計関数を条件式として使用することができます。例えば、「合計売上が100000円以上の部門だけを表示したい」という場合はHAVING SUM(sales_amount) >= 100000のように使用します。
この違いが重要なのは、もし「WHERE SUM(sales_amount) >= 100000」のように記述してしまうと、SQLエンジンはSUM()関数を集計前に評価しようとし、エラーを発生させるためです。逆に、「売上データから、商品IDが’P001’の商品を除外した上で、各部門の総売上が50000円以上の部門を表示したい」という複雑な要件の場合、WHERE句で商品を除外し、HAVING句で部門の総売上を絞り込む、というように両者を併用する必要があります。
SELECT department, SUM(sales_amount) AS total_sales
FROM sales_data
WHERE product_id != 'P001' -- グループ化前の個々の行を絞り込む
GROUP BY department
HAVING SUM(sales_amount) >= 50000; -- グループ化後の集計結果を絞り込む
この役割分担の理解が、正確で効率的な集計を行うための鍵となります。
- データグループ化前の個別の行を絞り込みたい →
WHERE句 - 集計結果(例: 合計値、平均値)に対して条件を適用したい →
HAVING句 WHERE句で集計関数は使えない。HAVING句で集計関数は使える。
この区別を意識することで、クエリのエラーや意図しない結果を効果的に回避できます。
SQL方言による構文の違いに注意する
SQLは標準規格(ISO標準SQL)が存在しますが、実際のデータベース製品(MySQL、PostgreSQL、Oracle Database、SQL Serverなど)は、それぞれ独自の拡張機能や微妙な構文の違いを持っており、これらは「SQL方言」と呼ばれます。基本的なSELECT、FROM、GROUP BY、SUM、COUNTといった構文は共通していても、日付関数や文字列関数、特定のデータ型に関する扱いで差異が生じることが頻繁にあります。
例えば、日付から年や月を抽出する関数は、PostgreSQLではEXTRACT(YEAR FROM date_column)やTO_CHAR(date_column, 'YYYY-MM')、MySQLではYEAR(date_column)やDATE_FORMAT(date_column, '%Y-%m')、SQL ServerではYEAR(date_column)やFORMAT(date_column, 'yyyy-MM')など、製品によって異なります。このような違いは、特に複雑な集計や日付・時刻に関する操作を行う際に、クエリの移植性を妨げる大きな要因となります。
この落とし穴を回避するためには、以下の点に注意することが推奨されます。
- 使用するデータベースのドキュメントを確認する: 開発中のプロジェクトや分析環境で使用されているデータベース製品の公式ドキュメントを常に参照し、利用可能な関数や構文の特性を理解しましょう。
- 標準SQLを意識する: 可能な限り標準SQLに準拠した記述を心がけることで、異なるデータベースへの移行や複数環境での利用における互換性を高めることができます。
- テスト環境での動作確認: 本番環境にデプロイする前に、必ずテスト環境でクエリが正しく動作し、期待通りの結果を返すかを確認することが重要です。
SQL方言を理解し、適切に対応することで、データベース環境に依存しない堅牢なデータ分析クエリを作成する能力が向上します。
非集計カラムのSELECTリストへの追加制限
GROUP BY句を使用する際によくある間違いの一つに、SELECT句にGROUP BY句で指定していない非集計カラムを含めてしまう、というものがあります。標準SQL(および多くのデータベース製品)では、GROUP BY句でグループ化されたクエリのSELECTリストには、以下のいずれかの種類のカラムしか指定できません。
GROUP BY句に直接含まれているカラム- 集計関数(
SUM,COUNT,AVG,MAX,MINなど)が適用されているカラム
例えば、「部門(department)ごとの売上合計」を計算するクエリで、departmentはGROUP BY句に含まれていますが、それに加えてproduct_nameのような個別の商品名をSELECT句に含めると、エラーが発生するか、あるいはデータベースによっては(MySQLの古いバージョンなど)意図しない単一のproduct_nameがランダムに選択されて表示される可能性があります。
-- エラーまたは意図しない結果になる可能性のある例
SELECT department, product_name, SUM(sales_amount) AS total_sales
FROM sales_data
GROUP BY department;
-- この場合、product_nameはどのグループのproduct_nameを表示すべきか一意に定まらないため、問題が生じます。
これは、「部門」というグループの中で、「商品名」が複数存在するため、どの商品名を表示すべきかSQLが判断できないためです。この制限を回避し、必要な情報を取得するためには、以下のいずれかの方法を検討します。
product_nameもグループ化の基準に含める(GROUP BY department, product_nameとする)。product_nameに対して集計関数を適用する(例:MAX(product_name)やSTRING_AGG(product_name, ', ')など)。- サブクエリや結合(JOIN)を使って、別途必要な詳細情報を取得する。
GROUP BYの原理を正しく理解し、SELECTリストのカラムに注意を払うことで、集計クエリの信頼性と正確性を保つことができます。
【ケース】部門別売上集計で直面した課題とその解決策
課題設定:部門別売上と平均単価の算出
ここでは、架空の総合商社「データトレード株式会社」の営業部門を例に、具体的なデータ分析の課題と解決策を見ていきます。データトレード株式会社は、複数の部門で多様な商品を扱っており、経営層からは「各部門がどれだけの売上を上げ、商品単価はどの程度か」を把握したいという要望がありました。特に、売上実績が芳しくない部門や、高単価商品を扱う部門の特定が急務とされています。
手元には、以下の情報を格納したsales_recordsというテーブルがあるとします。
sale_id: 取引IDdepartment: 部門名(例: ‘家電事業部’, ‘食品事業部’, ‘アパレル事業部’)product_name: 商品名unit_price: 商品単価quantity: 販売数量sale_date: 販売日
このデータから、「各部門の総売上(total_sales)と、部門ごとの平均商品単価(average_unit_price)」を算出し、それらの集計結果から総売上が低い部門を特定するという課題に直面しました。まずは、これらの指標を一目で把握できるようなレポートを作成する必要があります。
従来の集計方法では、手作業でデータを加工するか、スプレッドシートのピボットテーブルに頼ることが多く、時間と手間がかかっていました。また、データが大量になるにつれて処理が重くなるという問題も抱えていました。SQLのGROUP BY句と集計関数を活用することで、この課題を効率的に解決することが期待されます。
解決策:GROUP BYと集計関数によるデータ抽出
データトレード株式会社の課題を解決するため、SQLのGROUP BY句と集計関数を用いて、各部門の総売上と平均商品単価を算出します。総売上はunit_price * quantityの合計で計算し、平均単価はunit_priceの平均値で計算します。部門ごとに集計するため、GROUP BY departmentを指定します。
具体的なSQLクエリは以下のようになります。
SELECT
department,
SUM(unit_price * quantity) AS total_sales,
AVG(unit_price) AS average_unit_price
FROM sales_records
GROUP BY department
ORDER BY total_sales DESC;
このクエリの各部分が持つ意味は以下の通りです。
SELECT department, SUM(unit_price * quantity) AS total_sales, AVG(unit_price) AS average_unit_price: 部門名、総売上(単価と数量の積の合計)、平均商品単価を結果として表示します。FROM sales_records: 集計対象のテーブルはsales_recordsです。GROUP BY department:departmentカラムでデータをグループ化し、各部門ごとに集計を行います。ORDER BY total_sales DESC: 総売上が高い順に結果を並べ替えることで、売上貢献度の高い部門から順に確認しやすくします。
このクエリを実行することで、各部門の総売上と平均商品単価が瞬時に計算され、データトレード株式会社の経営層は、どの部門が目標を達成しているか、あるいは課題を抱えているかを明確に把握できるようになります。これにより、スプレッドシートでの手作業に比べて、圧倒的な効率化と正確なデータ分析が可能となります。
結果の評価と追加分析への示唆
上記のSQLクエリを実行して得られた集計結果は、データトレード株式会社の経営層にとって貴重な情報源となります。例えば、以下のような評価と追加分析への示唆が得られるでしょう。
- 売上貢献度の高い部門の特定:
total_salesが高い順に並べ替えることで、主力部門や成長著しい部門が一目で分かります。これらの部門の成功要因を深掘りし、他部門への横展開を検討できます。 - 課題部門の発見:
total_salesが低い部門を特定し、その原因を探るための追加分析に進むことができます。例えば、「その部門は単価が極端に低いのか(average_unit_priceを確認)、販売数量が少ないのか」といった切り口で詳細なデータを掘り下げることが可能です。 - 単価と売上の相関関係: 高い
average_unit_priceを持つ部門が必ずしも高いtotal_salesを上げているとは限りません。単価が高いものの売上は伸び悩んでいる部門があれば、高単価商品の販売戦略見直しや、顧客ターゲット層の再検討が必要となる可能性があります。
さらに、得られた結果をもとに、特定の条件で部門を絞り込むHAVING句を用いた追加分析も考えられます。例えば、「平均単価が10000円以上の部門の中で、総売上が500000円以下の部門を抽出する」といったクエリを実行することで、高単価商品を扱いながらも売上が伸び悩んでいる部門をピンポイントで特定し、具体的な改善策を検討するための根拠を得られるでしょう。このような反復的なデータ分析が、ビジネス戦略の精度を向上させ、継続的な成長へと繋がります。
まとめ
よくある質問
Q: GROUP BY句の基本的な役割は何ですか?
A: GROUP BY句は、指定した列の共通値に基づいて行をグループ化し、各グループに対して集計関数を適用するために使用します。これにより、部門別売上や商品別個数などの集計が可能になります。
Q: 集計関数(SUM, COUNTなど)はどのように使いますか?
A: 集計関数はGROUP BY句と組み合わせて、各グループのデータを要約します。例えば、SUM()で合計、COUNT()で行数、AVG()で平均値を求め、データの全体像を把握するのに役立ちます。
Q: 複数の列でグループ化する際のポイントは?
A: 複数の列でグループ化すると、指定したすべての列の組み合わせがユニークなグループとなります。例えば「地域と商品カテゴリ」でグループ化し、より詳細な集計分析を行う際に有効です。
Q: グループごとに連番を振る方法はありますか?
A: ウィンドウ関数(例: ROW_NUMBER() OVER (PARTITION BY … ORDER BY …))を用いることで、グループ内でソートされた順に連番を付与できます。これにより、各グループの上位N件などを特定するのに便利です。
Q: GROUP BYとHAVING句の違いを教えてください。
A: GROUP BY句は集計する前の行をグループ化するのに対し、HAVING句はGROUP BYで集計された結果に対して条件を指定し、特定のグループを絞り込みます。WHERE句は集計前の行に条件を適用します。
