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

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

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

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

Q&A

解決済

1回答

1058閲覧

レコードがnullを0(ゼロ)として表示させたい

yuic.sk12345

総合スコア6

MySQL

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

0グッド

0クリップ

投稿2023/06/06 04:02

編集2023/06/06 05:15

実現したいこと

  • sqlでレコードがないデータを「0(ゼロ)」と、表示させたい。
  • 表側となる「department_id」を、「総務」「経理」「庶務」などといった、部署名を表示させたい。(画像中にある、緑矢印部分は、「department_id」のid(5、8)が来るはずが、レコードがないデータであるため、表示されない。)

イメージ説明

前提

PHPとmysqlでクロス集計画面を作っています。

該当のソースコード

sql

1select 2department_id, 3/*date_format(dateOccurre1,'%Y%m') as yymm,*/ 4COUNT(*) as 合計, 5sum(case when level_id <= 4 then 1 else 0 end) as I計, 6sum(case when level_id >= 5 then 1 else 0 end) as A計, 7sum(case level_id when 1 then 1 else 0 end) as, 8sum(case level_id when 2 then 1 else 0 end) as, 9sum(case level_id when 3 then 1 else 0 end) as, 10sum(case level_id when 4 then 1 else 0 end) as 3a, 11sum(case level_id when 5 then 1 else 0 end) as 3b, 12sum(case level_id when 6 then 1 else 0 end) as, 13sum(case level_id when 7 then 1 else 0 end) as14FROM t_general 15LEFT OUTER JOIN department ON (t_general.department_id = department.id) 16GROUP BY department_id 17ORDER BY department_id ASC

sql

1-- テーブルの構造 `t_general` 2-- 3 4CREATE TABLE `t_general` ( 5 `id` int(11) NOT NULL, 6 `time_create` datetime NOT NULL, 7 `department_id` int(11) NOT NULL, 8 `occupation_id` int(11) NOT NULL, 9 `category_id` int(11) NOT NULL, 10 `yearsExp` int(11) NOT NULL, 11 `level_id` int(11) NOT NULL, 12 `dateOccurre1` date NOT NULL, 13 `date_weekday_id` int(11) NOT NULL, 14 `date_ampmwork_id` int(11) NOT NULL, 15 `place_id` int(11) NOT NULL, 16 `kind_id` int(11) NOT NULL, 17 `textContent` varchar(500) NOT NULL, 18 `textResponse` varchar(500) NOT NULL, 19 `cause_human_id` int(11) NOT NULL, 20 `cause_material_id` int(11) NOT NULL, 21 `cause_system_id` int(11) NOT NULL, 22 `cause_control_id` int(11) NOT NULL, 23 `cause_others_id` int(11) NOT NULL, 24 `textMeasure` varchar(500) NOT NULL 25) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; 26

sql

1-- テーブルのインデックス `t_general` 2-- 3ALTER TABLE `t_general` 4 ADD PRIMARY KEY (`id`), 5 ADD KEY `department_id` (`department_id`), 6 ADD KEY `occupation_id` (`occupation_id`), 7 ADD KEY `category_id` (`category_id`), 8 ADD KEY `level_id` (`level_id`), 9 ADD KEY `date_weekday_id` (`date_weekday_id`), 10 ADD KEY `date_ampmwork_id` (`date_ampmwork_id`), 11 ADD KEY `place_id` (`place_id`), 12 ADD KEY `kind_id` (`kind_id`), 13 ADD KEY `cause_human_id` (`cause_human_id`), 14 ADD KEY `cause_material_id` (`cause_material_id`), 15 ADD KEY `cause_system_id` (`cause_system_id`), 16 ADD KEY `cause_control_id` (`cause_control_id`), 17 ADD KEY `cause_others_id` (`cause_others_id`);

sql

1INSERT INTO `department` (`id`, `depa`) VALUES 2(1, 'ーーーー'), 3(2, '総務'), 4(3, '経理'), 5(4, '庶務'), 6(5, '人事部'), 7(6, '法務部'), 8(7, '情報システム部'), 9(8, '技術部'), 10(9, 'マーケティング部'), 11(10, '営業部'), 12(11, 'CS部'), 13(12, '相談室'), 14(13, '一般'), 15(14, '保育室'), 16(15, 'その他');

試したこと

「LEFT OUTER JOIN」を使用してみましたが、レコードがない部署は、表示されませんでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

yambejp

2023/06/06 04:40

サンプルデータが不十分で状況が確認できません
m.ts10806

2023/06/06 04:44 編集

そもそもの定義をNULL不可にして初期値0にするのはどうでしょう。 要件次第かもしれませんが、その要件詳細(前提条件等も)がほとんど書かれてないようにも見えますので。
yuic.sk12345

2023/06/06 04:54

ありがとうございます! `department_id` int(11) NOT NULL,としており、初期値は0となっております。 前提条件が見にくくてすみません。。。 先ほど、各カラムに以下のようなREPLACE関数を付けてみたのですが、やはり、すべて0(ゼロ)のレコードのdepartment_idは、表示されませんでした。。。 REPLACE(sum(case level_id when 1 then 1 else 0 end), 0, '-') as 0,
m.ts10806

2023/06/06 05:04

失礼、集計後の表で存在しない場合にnullになるから、ということですね。
guest

回答1

0

ベストアンサー

まず集計結果をサブクエリーにします。
部署ごとに表示したいなら部署に対してleft joinします
例示のように集計に対して部署をjoinするならright joinです

参考

集計のところを思いっきり省略するとこんな感じです

SQL

1CREATE TABLE `t_general` ( 2 `id` int primary key auto_increment, 3 `depa_id` int, 4 `val` int 5); 6insert into t_general(depa_id,val) values 7(1,100), 8(1,200), 9(1,300), 10(2,100), 11(2,150), 12(3,120); 13 14CREATE TABLE `department` ( 15 `id` int(11) NOT NULL, 16 `depa` varchar(20) 17); 18INSERT INTO `department` (`id`,`depa`) VALUES 19(1, '----'), 20(2, '総務'), 21(3, '経理'), 22(4, '庶務'), 23(5, '人事部');

集計

SQL

1select t1.id,t1.depa,coalesce(t2.val,0) as val 2from department as t1 3left join( 4select depa_id,sum(val) as val from t_general 5group by depa_id 6) as t2 on t1.id=t2.depa_id

結果

iddepaval
1----600
2総務250
3経理120
4庶務0
5人事部0

投稿2023/06/06 04:43

編集2023/06/06 04:54
yambejp

総合スコア114839

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

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

yuic.sk12345

2023/06/06 05:18

ありがとうございます! さっそく試してみます!!
yuic.sk12345

2023/06/06 06:33

@yambejpさま 以下のSQLでできました!! 完璧です!! 本当に助かりました!! ありがとうございます!!! select t1.id, t1.depa, coalesce(t2.department_id,0) as val, coalesce(t2.合計,0) as 合計, coalesce(t2.I計,0) as I計, coalesce(t2.A計,0) as A計, coalesce(t2.0,0) as 0, coalesce(t2.1,0) as 1, coalesce(t2.2,0) as 2, coalesce(t2.3a,0) as 3a, coalesce(t2.3b,0) as 3b, coalesce(t2.4,0) as 4, coalesce(t2.5,0) as 5 from department as t1 left join( select department_id,COUNT(*) as 合計, sum(case when level_id <= 4 then 1 else 0 end) as I計, sum(case when level_id >= 5 then 1 else 0 end) as A計, sum(case level_id when 1 then 1 else 0 end) as 0, sum(case level_id when 2 then 1 else 0 end) as 1, sum(case level_id when 3 then 1 else 0 end) as 2, sum(case level_id when 4 then 1 else 0 end) as 3a, sum(case level_id when 5 then 1 else 0 end) as 3b, sum(case level_id when 6 then 1 else 0 end) as 4, sum(case level_id when 7 then 1 else 0 end) as 5 from t_general AS t2 group by department_id ) as t2 on t1.id=t2.department_id
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問