質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

Q&A

解決済

3回答

710閲覧

レコード抽出条件について

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

0グッド

0クリップ

投稿2020/06/04 05:34

XAMPPにあるMySQL(10.3.15-MariaDB)とPHP7.3.6でプログラムを自作しています。

下記の通り、材料と加工の集計を導き出し、集計を行うことを行いたいと思っています。

MySQL

1CREATE VIEW `flow_a120_sum_view` AS 2 WITH `maxq` AS ( 3 SELECT 4 *, 5 CONCAT ( `pnum_`, `bnum_` , `inum_` ) AS `_sid_`, 6 MAX(`pnow_`) OVER ( PARTITION BY `pnum_`, `bnum_`,`inum_`, `pslct`, `enum_`) AS `mxpnw` 7 FROM 8 `flow_a120tbl` 9 ) 10SELECT 11 `_sid_`, 12 COUNT(`pmony` <> 0 or NULL) AS `_evq_`, 13 SUM( CASE `pslct` WHEN '材料' THEN `pmony` ELSE 0 END ) AS `smmtm`, 14 SUM( CASE `pslct` WHEN '加工' THEN `pmony` ELSE 0 END ) AS `smprm` 15 16FROM 17 `maxq` 18WHERE 19 `pnow_` = `mxpnw` 20GROUP BY 21 `pnum_`, 22 `bnum_`, 23 `inum_` 24;

上記の方法だと「pnow_値が最大のとき」のレコードを抽出することができました。
これに付け加えて「gnum_値が最大のとき」も条件に加えるにはどうすればよいのでしょうか。

やってみたこと

  • pnow_値が最大のとき」の構文「MAX(pnow_) OVER ( PARTITION ・・・(略)」を複製して「MAX(gnum_) OVER ( PARTITION ・・・(略)」を追記してみましたがうまくいきませんでした。

MySQL

1CREATE VIEW `flow_a120_sum_view` AS 2 WITH `maxq` AS ( 3 SELECT 4 *, 5 CONCAT ( `pnum_`, `bnum_` , `inum_` ) AS `_sid_`, 6 MAX(`pnow_`) OVER ( PARTITION BY `pnum_`, `bnum_`,`inum_`, `pslct`, `enum_`) AS `mxpnw`, 7 MAX(`gnum_`) OVER ( PARTITION BY `pnum_`, `bnum_`,`inum_`, `pslct`, `enum_`) AS `mxgnw` 8 FROM 9 `flow_a120tbl` 10 ) 11SELECT 12 `_sid_`, 13 COUNT(`pmony` <> 0 or NULL) AS `_evq_`, 14 SUM( CASE `pslct` WHEN '材料' THEN `pmony` ELSE 0 END ) AS `smmtm`, 15 SUM( CASE `pslct` WHEN '加工' THEN `pmony` ELSE 0 END ) AS `smprm` 16 17FROM 18 `maxq` 19WHERE 20 `pnow_` = `mxpnw` AND `gnum_` = `mxgnw` 21;

やりたいこと

  • 材料費と加工費の計算(レコードごとの合計)を行う前に、pnow_gnum_の値が最大値と同じレコードを抽出し、材料費と加工費の集計を行いたいです。

入力されるデータ例

管理No品名費用区分費用金額現行工程最終工程グループコード
K01りんご材料費50021602
K01りんご材料費50121609
K01りんご加工費150121609
K01りんご材料費50121611
K01りんご加工費150121611

現在の出力データ例

管理No品名材料費合計加工費合計現行工程最終工程グループコード
K01りんご100300121611

※材料費と加工費の合計を出す際、現在工程pnow_が最大値のレコードだけを抽出しているため、グループコードgnum_が最大値の時も抽出条件に加えないと凡例のデータで抽出した場合、2レコード分の合計を計算してしまっている

出力させたいデータ例

管理No品名材料費合計加工費合計現行工程最終工程グループコード
K01りんご50150121611

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/06/04 05:43

view以前にテーブルとそのサンプルを例示してもらわないと・・・
hope_mucci

2020/06/04 06:03

ソースの列名と入力データ名の列名が合致していないのでちんぷんかんぷんです。 どっちかに合わせてください。 あと、「やってみたこと」でgroup byを消した理由はなんでしょう?消さなければうまくいくのでは?
guest

回答3

0

ベストアンサー

いろいろチャレンジした結果、自己解決できました。

WITHを使って2段階でのクエリを行っていました。これが原因みたいになっていました。

解決した方法は・・・
0. 最初に現行値(pnow_)の値の最大値を見つけだし、pnow_とpnow_の最大値が一緒になるレコードを抽出するビューを作成
0. 前項の結果をもとに、グループコード(gnum_)の最大値を見つけ出し、gnum_とgnum_の最大値が一緒になるレコードを抽出

SQL

1CREATE VIEW `flow_a120_max_pnow` AS 2SELECT 3 *, 4 CONCAT ( `pnum_`, `bnum_` , `inum_` ) AS `_sid_`, 5 MAX(`pnow_`) OVER ( PARTITION BY `pnum_`, `bnum_`,`inum_`, `pslct`, `enum_`) AS `mxpnw` 6FROM 7 `flow_a120tbl` 8; 9 10 11CREATE VIEW `flow_a120_gc_pnow` AS 12SELECT 13 *, 14 MAX(`gnum_`) OVER ( PARTITION BY `pnum_`, `bnum_`,`inum_`, `pslct`, `enum_`) AS `mxgnm` 15FROM 16 `flow_a120_max_pnow` 17WHERE 18 `pnow_` = `mxpnw` 19; 20 21 22CREATE VIEW `flow_a120_sum_view` AS 23SELECT 24 `_sid_`, 25 COUNT(`pmony` <> 0 or NULL) AS `_evq_`, 26 SUM( CASE `pslct` WHEN '材料' THEN `pmony` ELSE 0 END ) AS `smmtm`, 27 SUM( CASE `pslct` WHEN '加工' THEN `pmony` ELSE 0 END ) AS `smprm` 28 29FROM 30 `flow_a120_gc_pnow` 31WHERE 32 `gnum_` = `mxgnm` 33GROUP BY 34 `pnum_`, 35 `bnum_`, 36 `inum_`, 37 `gnum_` 38; 39

いろいろご指導いただきありがとうございました。

きっと考えた私の方法よりも、皆様から教えていただいたやり方の方がスマートかつ高速なのかもしれませんが、今後自分で触ったときにわからなくならないようにするためにも、この方法で進めていこうと思います。

投稿2020/06/23 04:41

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

SQL:2003 のウィンドウ関数を MariaDB 10.2 で試す
ROW_NUMBER() OVER(PARTITION BY ...
をインラインビューで記述、あとは分かるかと。

なお、SQLで使われるテーブルはCREATE TABLEされている必要があります。質問のテーブル定義の説明もCREATE TABLEに変更。SELECTされるデータもINSERTされている必要があります。INSERT文でデータを提示できた方が実際にSQLを実行できるので適切なコメントが付き易いのでは?

投稿2020/06/04 07:21

Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

現在工程pnow_が最大値のレコードだけを抽出しているため、グループコードgnum_が最大値の時も抽出条件に加えないと

pnow_の最大は、gnum_が同じもののうちの最大でないと駄目なんじゃないでしょうか。
試されたものはそれぞれ独立しています。

(pnum_, bnum_,inum_, pslct, enum_)がそれらの区切りなら、それも条件に加えないと駄目なんでは。

追記

最大のgnum_のうち最大のpnow_に関する集計なら以下のようになるかと思います。
仕様的にあっているなら、分析関数を使用するまでもありません。
※件数の箇所はNUllの扱いが正しくなかったので変更しています。

SQL

1SELECT 2 CONCAT ( `pnum_`, `bnum_` , `inum_` ) AS `_sid_`, 3 COUNT((COALESCE(`pmony`, 0) <> 0)) AS `_evq_`, 4 SUM( CASE `pslct` WHEN '材料' THEN `pmony` ELSE 0 END ) AS `smmtm`, 5 SUM( CASE `pslct` WHEN '加工' THEN `pmony` ELSE 0 END ) AS `smprm` 6 7FROM `flow_a120tbl` t1 8WHERE 9 `gnum_` = (select Max(`gnum_`) from `flow_a120tbl`) 10 AND `pnow_` = (select Max(`pnow_`) from `flow_a120tbl` where `gnum_` = t1.`gnum`) 11GROUP BY 12 `pnum_`, 13 `bnum_`, 14 `inum_`

投稿2020/06/04 06:50

編集2020/06/04 07:33
sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問