MySQLの累積集計原理と使用例の分析

MySQLの累積集計原理と使用例の分析

この記事では、例を使用して、MySQL 累積集計の原理と使用方法を説明します。ご参考までに、詳細は以下の通りです。

累積集計は、各従業員の毎月初めから現在までの累積注文数と平均注文数を返すなど、シーケンスの最初の要素から現在の要素までのデータを集計します。

行番号の問題には 2 つの解決策があります。1 つはサブクエリを使用すること、もう 1 つは結合を使用することです。通常、サブクエリ方式の方が直感的で読みやすくなります。ただし、集計が必要な場合、サブクエリは集計ごとにデータを 1 回スキャンする必要がありますが、接続方法では通常、結果を取得するために 1 回スキャンするだけで済みます。次のクエリは結合を使用して結果を取得します

選択
 a.empid、
 a.ordermonth、a.qty AS thismonth、
 SUM(b.qty) AS 合計、
 CAST(AVG(b.qty) AS DECIMAL(5,2)) AS avg
empordersから
INNER JOIN emporders b
  オン a.empid=b.empid
  かつ、b.ordermonth <= a.ordermonth
GROUP BY a.empid、a.ordermonth、a.qty
ORDER BY a.empid,a.ordermonth

2015年の累計注文数のみを照会したい場合は、where条件を追加できます。

DATE_FORMAT(a.ordermonth,'%Y')='2015' かつ DATE_FORMAT(b.ordermonth,'%Y')='2015' の場合

結果は以下のとおりです

また、特定の目標が達成されるまで、各従業員の月間注文のみを返すなど、データをフィルタリングすることもできます。ここでは、各従業員の注文総数が 1,000 に達する前にカウントされると想定します。

ここでHAVINGフィルタを使用してクエリを完成させることができます

選択
 a.empid、
 a.ordermonth、a.qty AS thismonth、
 SUM(b.qty) AS 合計、
 CAST(AVG(b.qty) AS DECIMAL(5,2)) AS avg
empordersから
INNER JOIN emporders b
  オン a.empid=b.empid
  かつ、b.ordermonth <= a.ordermonth
DATE_FORMAT(a.ordermonth,'%Y')='2015' かつ DATE_FORMAT(b.ordermonth,'%Y')='2015' の場合
GROUP BY a.empid、a.ordermonth、a.qty
合計が1000未満
ORDER BY a.empid,a.ordermonth

1000 に達した月の状況はここにはカウントされません。統計を取る場合は状況が少し複雑になります。合計 <= 1000 が指定された場合、その月の注文数がちょうど 1000 の場合にのみ統計が取得されます。それ以外の場合、その月の統計は取得されません。したがって、この問題のフィルタリングは別の側面から検討することができます。累計受注数が1000未満の場合、累計受注数と前月の受注数の差が1000未満となります。同時に、受注数が1000を超える最初の月もカウントできます。したがって、このソリューションのSQL文は次のようになります。

選択
 a.empid、
 a.ordermonth、a.qty AS thismonth、
 SUM(b.qty) AS 合計、
 CAST(AVG(b.qty) AS DECIMAL(5,2)) AS avg
empordersから
INNER JOIN emporders b
  オン a.empid=b.empid
  かつ、b.ordermonth <= a.ordermonth
DATE_FORMAT(a.ordermonth,'%Y')='2015' かつ DATE_FORMAT(b.ordermonth,'%Y')='2015' の場合
GROUP BY a.empid、a.ordermonth、a.qty
合計数量が 1000 未満
ORDER BY a.empid,a.ordermonth

結果は以下のとおりです

累計注文数が 1000 の月のデータのみを返し、前の月は返さない場合は、上記の SQL ステートメントを変更できます。

さらにフィルタリングし、累計注文数量が 1000 以上という条件を追加します。この問題の SQL ステートメントは次のとおりです。

選択
 a.empid、
 a.ordermonth、a.qty AS thismonth、
 SUM(b.qty) AS 合計、
 CAST(AVG(b.qty) AS DECIMAL(5,2)) AS avg
empordersから
INNER JOIN emporders b
  オン a.empid=b.empid
  かつ、b.ordermonth <= a.ordermonth
DATE_FORMAT(a.ordermonth,'%Y')='2015' かつ DATE_FORMAT(b.ordermonth,'%Y')='2015' の場合
GROUP BY a.empid、a.ordermonth、a.qty
合計数量 < 1000 かつ 合計 >= 1000
ORDER BY a.empid,a.ordermonth

結果は以下のとおりです

MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL クエリ スキル」、「MySQL 共通関数の概要」、「MySQL ログ操作スキル」、「MySQL トランザクション操作スキルの概要」、「MySQL ストアド プロシージャ スキル」、および「MySQL データベース ロック関連スキルの概要」

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • MySQL の集計関数 count の使用法とパフォーマンスの最適化テクニック
  • MySQLでよく使われる集計関数の詳細な説明
  • MySql の集計関数に条件式を追加する方法
  • php+mysql オープンソース XNA 集計プログラムがダウンロード用にリリースされました
  • Mysql は非集計列を選択できません
  • MySQL クエリのソートとクエリ集計関数の使用法の分析
  • MySQL の単一テーブル クエリ操作例の詳細な説明 [構文、制約、グループ化、集計、フィルタリング、並べ替えなど]
  • MySQL 継続的集計の原理と使用法の分析
  • MySQL スライディング集計/年初来集計の原理と使用例の分析

<<:  Nginxでネットワーク分離を解決した実践記録を詳しく解説

>>:  HTMLフォーム送信方法のケーススタディ

推薦する

Linux bzip2 コマンドの使用

1. コマンドの紹介bzip2 は、ファイルの圧縮と解凍に使用されます。これは、Linux システム...

鏡像効果を実現する JavaScript キャンバス

この記事では、JavaScriptキャンバスでミラーイメージ効果を実現するための具体的なコードを参考...

初心者がHTMLタグを学ぶ(1)

初心者は、いくつかの HTML タグを理解することで HTML を学習できます。この入門書は、初心者...

CSSボックスモデルの紹介を読めば、混乱することはなくなるでしょう

Web デザインでよく耳にするプロパティ名: content、padding、border、marg...

divコンテナ内の背景色または画像は、サイズが大きくなるにつれて大きくなります。

コードをコピーコードは次のとおりです。高さ:自動 !重要;高さ:550px;最小高さ:550px; ...

MySQL Null は 5 つの問題を引き起こす可能性があります (すべて致命的)

目次1. カウントデータが失われる解決2. 明確なデータ損失3.データ損失を選択解決4. Nullポ...

携帯電話向けウェブページ作成のヒント

現在では多くの人がスマートフォンを使用していることを考慮すると、モバイル Web ページの書き方は、...

Vue 名前付きスロットの基本的な使用例

序文名前付きスロットは、スロット内の「name」属性を使用して要素にバインドされます。知らせ: 1....

Vue 3 での watch と watchEffect の新しい使い方

目次1. 時計の新しい使い方1.1. ウォッチの使用構文1.2. 複数の属性値を監視する1.3. 参...

Ubuntu 20.04 ファイアウォール設定の簡単なチュートリアル (初心者)

序文ますます便利になった今日のインターネット社会では、さまざまなインターネット ランサムウェア ウイ...

スーパーバイザーを使用して nginx + tomcat コンテナを管理する例

必要: docker を使用して nginx + tomcat デュアル プロセスを起動します。実際...

MySQL 8の新機能ウィンドウ関数の役割

MySQL 8.0 の新機能は次のとおりです。 Unicode 9.0 をすぐに完全にサポートウィン...

IDEA を使用して Web プロジェクトを作成し、Tomcat に公開する方法

目次ウェブ開発1. Web開発の概要Tomcatのインストールと設定Tomcatをインストールする2...

Navicatを使ってMySQLを操作する方法

目次序文: 1. Navicatの紹介2. シンプルなチュートリアルの共有接続管理ライブラリテーブル...

Docker を使用して Microsoft Sql Server を展開するための詳細な手順

目次1 背景2 コンテナを作成する3 SAパスワードを変更する4 mssql のリンク5. コンテナ...