Mysqlのマージ結果と水平スプライシングフィールドの実装手順

Mysqlのマージ結果と水平スプライシングフィールドの実装手順

序文

最近、レポート機能に取り組んでいたのですが、ある月に各部署に入社した人と退職した人の数をカウントする必要がありました。

私の歩み

まず従業員数を調べる

SELECT dept ,COUNT(1) rcNumber FROM employee table WHERE (Joining time!= ''
  または、参加日が NULL ではない) かつ DATE_FORMAT(参加日、'%Y-%m') = '2019-09'
部門IDによるグループ化
部門名で並べ替え

クエリレコード

辞職した人数を照会する場合、SQL は次のようになります。

SELECT dept ,COUNT(1) rcNumber FROM employee table WHERE (退職日 != ''
  または、退職日が NULL ではない) かつ DATE_FORMAT(入社日、'%Y-%m') = '2019-09'
部門IDによるグループ化
部門名で並べ替え

結果セット

私が欲しいデータはこれです

私は次のことを試しました

1. 2つのクエリ結果を2つのテーブルとみなし、左結合を使用します。正直、データ形式は私が望むものですが、右側のテーブルにレコードが多い場合、この方法を使用するとデータが少なくなるのではないでしょうか?(右側も同様)

2. 欲しいデータではないunion allを使って、2つの結果を直接加算し、垂直につなぎ合わせます。

3. select * from a,b を使用しました。結果は 2 つのテーブルの直積になります。

上記の方法の SQL は掲載しませんが、意味は明らかであるはずです。

信じられなかったので、Baiduに問い合わせ続けました。Baiduがようやく答えをくれたので、試してみました。

1. エントリSQLを次のように処理します。

SELECT a.dept,a.rcNumber,0 as lcNumber FROM (SELECT dept ,COUNT(1) rcNumber FROM employee table WHERE (Joining time!= ''
  または、参加日が NULL ではない) かつ DATE_FORMAT(参加日、'%Y-%m') = '2019-09'
部門IDによるグループ化
部門名で並べ替える)a

辞職SQLは次のように処理されます。

SELECT a.dept,a.lcNumber,0 as rcNumber FROM (SELECT dept ,COUNT(1) rcNumber FROM employee table WHERE (退職日 != ''
  または、退職日が NULL ではない) かつ DATE_FORMAT(入社日、'%Y-%m') = '2019-09'
部門IDによるグループ化
部門名で並べ替える)a

外側にレイヤーを追加したり、追加しなかったりすることもできます。私は、基本ステートメントを破壊しないように、元の SQL に追加するだけです。もちろん、これだけでは十分ではありません。

2. 2つの文を垂直に結合し、合計で結合します。

SELECT dept ,sum(cm_1) as rcNumber,sum(cm_0) as lcNumber FROM( SELECT c.id,c.dept,SUM(c.lcNumber) as cm_0,c.rcNumber as cm_1 FROM 
(SELECT a.dept,a.rcNumber,0 as lcNumber FROM (SELECT dept ,COUNT(1) rcNumber FROM 従業員テーブル WHERE (入社時間!= ''
  または、参加日が NULL ではない) かつ DATE_FORMAT(参加日、'%Y-%m') = '2019-09'
部門IDによるグループ化
ORDER BY 部門名) a) c GROUP BY c.dept
ユニオンオール 
d.id、d.dept、d.lcNumberをcm_0として選択し、SUM(d.rcNumber)をcm_1として選択します。 
(SELECT a.dept,a.lcNumber,0 as rcNumber FROM (SELECT dept ,COUNT(1) rcNumber FROM 従業員テーブル WHERE ( 退職時刻 != ''
  または quit_date が NULL ではない) かつ DATE_FORMAT(join_date, '%Y-%m') = '2019-09'
部門IDによるグループ化
ORDER BY 部門名) a) d GROUP BY d.dept) t GROUP BY t.dept ORDER BY t.id

ついに望んでいた結果が得られました

要約する

これで、MySQL のマージ結果と水平スプライシング フィールドに関するこの記事は終了です。MySQL のマージ結果と水平スプライシング フィールドに関するより詳しい情報については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Mysqlはフィールドスプライシングのための3つの関数を実装している
  • MySQL 文字列連結関数 GROUP_CONCAT の詳細な説明
  • MySQL で複数のフィールドを連結する詳細な例

<<:  CentOS/RHEL システムで VLAN タグ付きイーサネット カードを使用する方法

>>:  JSは円形のプログレスバーのドラッグとスライドを実装します

推薦する

文字列の GBK および GB2312 エンコードとデコードのフロントエンド実装 (概要)

序文プロジェクトを開発しているときに、かなり厄介な問題に遭遇しました。この製品では、判断のためにブラ...

JavaScript Canvas は動的なワイヤーフレーム効果を描画します

この記事では、JavaScript Canvasの動的なワイヤーフレーム効果を描画する具体的なコード...

カレンダー効果を実現するための Bootstrap+JQuery

この記事では、カレンダー効果を実現するためのBootstrap+Jqueryの具体的なコードを参考ま...

MySQL の時間タイプの選択

目次日時タイムスタンプ選び方ミリ秒の時間を保存する方法結論MySQL は、日付と時刻を処理するために...

MySQL マスタースレーブレプリケーションと読み取り書き込み分離の詳細な説明

目次序文1. 概要2. 読み取りと書き込みの分離3. MySQL マスタースレーブレプリケーションの...

DockerコンテナでLNMPをコンパイルする例

目次1. プロジェクトの説明2. Nginxイメージの作成3. MySQLイメージの作成4. PHP...

Linux Jenkins 構成スレーブノード実装プロセス図

序文: Jenkins のマスター スレーブ分散アーキテクチャは、主に、Jenkins に単一ポイン...

携帯電話番号の歩数記録を取得するWeChatアプレット

序文最近、小さなプログラムを開発しているときに、このような問題に遭遇しました。ユーザーが認証をクリッ...

1 つの記事で JSON (JavaScript Object Notation) を理解する

目次JSONが登場JSON構造JSONオブジェクトJson オブジェクトと JavaScript オ...

HTML 挿入画像の例 (HTML 追加画像)

HTML に画像を挿入するには、画像を表示するための HTML タグが必要です。これは、img タ...

Vueウォッチの監視方法の概要

目次1. Vueにおけるwatchの役割はその名の通り、監視の役割です。 2. このオブジェクトのプ...

RHEL8 /CentOS8 でマルチノード Elastic Stack クラスターを構築する方法

一般的に ELK スタックとして知られる Elastic スタックは、Elasticsearch、L...

Vue は Websocket カスタマー サービス チャット機能を実装します

この記事では主に基本的なチャットの実装方法を紹介します。今後は絵文字や写真のアップロードなどの機能も...

Windows 10 1903 エラー 0xc0000135 の解決方法 [推奨]

Windows 10 1903 は、2019 年に Microsoft がリリースした Windo...

CSS 評価効果の星の例

何?何のスターコートですか?さて、もっとわかりやすくするために写真を見てみましょう。 よく見ると、パ...