mysql 行列変換サンプルコード

mysql 行列変換サンプルコード

1. 需要

3 つのテーブルがあります。一定期間にわたるさまざまな抗生物質感受性の結果、つまり report_item_drugs テーブルの drugs_result、さまざまなプロジェクト project_name およびさまざまな抗生物質 antibiotic_dict_name の割合を分類してカウントし、行に薬剤感受性の結果を表示する必要があります。効果は次のとおりです。

元の 3 つのテーブル (必須フィールドのみを例として挙げています) は次のとおりです。

報告書フォーム

プロジェクトリスト

抗生物質テーブル(薬剤感受性結果 drugs_result は値の列です)

2. 実装

1. プロジェクトと抗生物質グループ別に検出された症例の総数を計算する

選択 
 A.project_name、A.antibiotic_dict_name、SUM(nums) AS 検出総数 FROM 
(
      SELECT i.project_name,d.antibiotic_dict_name,d.drugs_result,COUNT(d.id) AS nums FROM `report` r
       右結合 report_item i ON r.id=i.report_id
       右結合 report_item_drugs d ON d.report_item_id=i.id
       r.report_status=2 かつ r.add_date が '2020-01-01' から '2020-12-30' の間 
       i.project_id、d.antibiotic_dict_id、d.drugs_result でグループ化
 )A
 GROUP BY A.プロジェクト名、A.抗生物質辞書名

2. プロジェクト、抗生物質、薬剤感受性結果に応じて、異なる薬剤感受性結果の数を計算する

SELECT i.project_name,d.antibiotic_dict_name,IF(d.drugs_result<>'', d.drugs_result, '未入力') AS drugs_result,COUNT(d.id) AS quantity FROM `report` r
右結合 report_item i ON r.id=i.report_id
右結合 report_item_drugs d ON d.report_item_id=i.id
r.report_status=2 かつ r.add_date が '2020-01-01' から '2020-12-30' の間 
i.project_id、d.antibiotic_dict_id、d.drugs_result でグループ化  

3. 2つの結果をリンクする

選択 
      BB.project_name、BB.antibiotic_dict_name、BB.drugs_result、BB.`quantity`、AA.`検出総数`
    から 
        (
              選択 
                A.project_name、A.antibiotic_dict_name、SUM(nums) AS 検出総数 FROM 
              (
                    SELECT i.project_name,d.antibiotic_dict_name,d.drugs_result,COUNT(d.id) AS nums FROM `report` r
                    右結合 report_item i ON r.id=i.report_id
                    右結合 report_item_drugs d ON d.report_item_id=i.id
                    r.report_status=2 かつ r.add_date が '2020-01-01' から '2020-12-30' の間 
                    i.project_id、d.antibiotic_dict_id、d.drugs_result でグループ化
              )A
              GROUP BY A.プロジェクト名、A.抗生物質辞書名
        ) AA 
        右結合 
        (
              SELECT i.project_name,d.antibiotic_dict_name,IF(d.drugs_result<>'', d.drugs_result, '未入力') AS drugs_result,COUNT(d.id) AS quantity FROM `report` r
              右結合 report_item i ON r.id=i.report_id
              右結合 report_item_drugs d ON d.report_item_id=i.id
              r.report_status=2 かつ r.add_date が '2020-01-01' から '2020-12-30' の間 
              i.project_id、d.antibiotic_dict_id、d.drugs_result でグループ化            
        )BB ON AA.project_name=BB.project_name かつ AA.antibiotic_dict_name=BB.antibiotic_dict_name
    ここで、AA.`検出総数`<>'

4. 一般的に、異なる薬剤感受性の数と合計数は前のステップで入手できるため、比率を直接計算できます。

しかし、必要なのは薬剤感受性を行に表示することであり、比率を直接計算するだけでは要件を満たさないため、列を行に変換する必要があります。

行と列を変換する際にはcaseを使用し、薬物感受性の結果を辞書に従って読みやすい中国語の文字に変換します。


選択
  C.project_name プロジェクト名、C.antibiotic_dict_name 抗生物質名、C.`検出総数`、
  SUM(CASE C.`drugs_result` WHEN 'D' THEN C.`Quantity` ELSE 0 END ) AS '用量依存感度',
  CONCAT(SUM(CASE C.`drugs_result` WHEN 'D' THEN FORMAT(C.`Quantity`/C.`Total number of detections`*100,2) ELSE 0 END),'%') AS '用量依存感度比',
  SUM(CASE C.`drugs_result` WHEN 'R' THEN C.`Quantity` ELSE 0 END ) AS '薬剤耐性',
  CONCAT(SUM(CASE C.`drugs_result` WHEN 'R' THEN FORMAT(C.`Quantity`/C.`Total number of detections`*100,2) ELSE 0 END),'%') AS '薬剤耐性率',
  SUM(CASE C.`drugs_result` WHEN 'S' THEN C.`Quantity` ELSE 0 END ) AS 'Sensitive',
  CONCAT(SUM(CASE C.`drugs_result` WHEN 'S' THEN FORMAT(C.`Quantity`/C.`Total number of detections`*100,2) ELSE 0 END),'%') AS 'Sensitive ratio',
  SUM(CASE C.`drugs_result` WHEN 'I' THEN C.`Quantity` ELSE 0 END ) AS 'Agency',
  CONCAT(SUM(CASE C.`drugs_result` WHEN 'I' THEN FORMAT(C.`Quantity`/C.`Total Detection`*100,2) ELSE 0 END),'%') AS '中間比率',
  SUM(CASE C.`drugs_result` WHEN 'n1' THEN C.`quantity` ELSE 0 END ) AS 'non-sensitive',
  CONCAT(SUM(CASE C.`drugs_result` WHEN 'n1' THEN FORMAT(C.`Quantity`/C.`Total number of detections`*100,2) ELSE 0 END),'%') AS '非感受性比率',
  SUM(CASE C.`drugs_result` WHEN 'N' THEN C.`Quantity` ELSE 0 END ) AS 'None',
  CONCAT(SUM(CASE C.`drugs_result` WHEN 'N' THEN FORMAT(C.`Quantity`/C.`Total Detection`*100,2) ELSE 0 END),'%') AS '比率なし',
  SUM(CASE C.`drugs_result` WHEN '未記入' THEN C.`Quantity` ELSE 0 END ) AS '未記入',
  CONCAT(SUM(CASE C.`drugs_result` WHEN '未記入' THEN FORMAT(C.`数量`/C.`検出総数`*100,2) ELSE 0 END),'%') AS '未記入比率'
から
(
    選択 
      BB.project_name、BB.antibiotic_dict_name、BB.drugs_result、BB.`quantity`、AA.`検出総数`
    から 
        (
              選択 
                A.project_name、A.antibiotic_dict_name、SUM(nums) AS 検出総数 FROM 
              (
                    SELECT i.project_name,d.antibiotic_dict_name,d.drugs_result,COUNT(d.id) AS nums FROM `report` r
                    右結合 report_item i ON r.id=i.report_id
                    右結合 report_item_drugs d ON d.report_item_id=i.id
                    r.report_status=2 かつ r.add_date が '2020-01-01' から '2020-12-30' の間 
                    i.project_id、d.antibiotic_dict_id、d.drugs_result でグループ化
              )A
              GROUP BY A.プロジェクト名、A.抗生物質辞書名
        ) AA 
        右結合 
        (
              SELECT i.project_name,d.antibiotic_dict_name,IF(d.drugs_result<>'', d.drugs_result, '未入力') AS drugs_result,COUNT(d.id) AS quantity FROM `report` r
              右結合 report_item i ON r.id=i.report_id
              右結合 report_item_drugs d ON d.report_item_id=i.id
              r.report_status=2 かつ r.add_date が '2020-01-01' から '2020-12-30' の間 
              i.project_id、d.antibiotic_dict_id、d.drugs_result でグループ化            
        )BB ON AA.project_name=BB.project_name かつ AA.antibiotic_dict_name=BB.antibiotic_dict_name
    ここで、AA.`検出総数`<>'                                        
)C
GROUP BY C.プロジェクト名、C.抗生物質辞書名;

5. 結果を確認し、変換に成功する


MySQL の行と列の変換のサンプルコードに関するこの記事はこれで終わりです。MySQL の行と列の変換に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • 行と列の変換のデータベース実装 (mysql の例)
  • mysql の行と列の動的変換の実装 (分割表、クロス表)

<<:  ブラウザでのjsのイベントループイベントキューの詳細な説明

>>:  dl、dt、dd はいつ使用するのが適切ですか?

推薦する

固定、流動的、柔軟なウェブページレイアウトの長所と短所の分析

ウェブデザイナーを長い間悩ませてきた疑問があります。それは、固定レイアウト、流動的レイアウト、柔軟レ...

CSS 背景と境界タグの例の詳細な説明

1. CSS背景タグ1.背景色を設定するbackground-ground-color プロパティは...

MySQLデータベースの管理者パスワードを忘れた場合の解決策

1. コマンド mysqld --skip-grant-tables を入力します (前提条件: m...

GoのDockerデプロイメント用の基本イメージ2つの実装

1. golang:最新のベースイメージ mkdir gotest タッチメイン.go Docker...

vuex での Getter の使用法の詳細な説明

序文Vuex を使用すると、ストア内に「ゲッター」を定義できます (これはストアの計算されたプロパテ...

Nginx Httpモジュールシリーズにおけるautoindexモジュールの具体的な使用法

ブラウザ モジュールの主な機能は、http リクエスト ヘッダーの「User-Agent」の値とブラ...

MySQL のスケジュールされた完全なデータベースバックアップ

目次1. MySQLデータのバックアップ1.1、データをバックアップするためのmysqldumpコマ...

Reactでパスワード強度検出器を実装する方法

目次序文使用コンポーネントの記述データ構造分析プロセス分析基礎コードの分析他の要約する序文パスワード...

reactにおけるstateの略語の詳細な説明

序文国家とは何か私たちは皆、React はステート マシンであると言います。それはどのように反映され...

CentOS 7.3 で Nginx 仮想ホストを設定する方法

実験環境最小限にインストールされた CentOS 7.3 仮想マシン基本環境を構成する1. ngin...

CSS 等高レイアウトの一般的な方法

等高レイアウト同じ親コンテナー内の同じ高さの子要素のレイアウトを指します。等高レイアウトの実装の観点...

React の国際化 react-intl の使用

React で国際化を実現するにはどうすればよいでしょうか? react-intlプラグインは、Re...

ウェブフロントエンドコードを書く際の考慮事項のまとめ

1. HTMLタグの前に次のような文を追加するのが最適です。 <!DOCTYPE HTML P...

MySQLの自動増分主キーの実装の詳細な説明

目次1. 自己増分値はどこに保存されますか? 2. 自己価値修正メカニズム3. 自動増分値を変更する...