実現したいこと
- 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 0, 8sum(case level_id when 2 then 1 else 0 end) as 1, 9sum(case level_id when 3 then 1 else 0 end) as 2, 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 4, 13sum(case level_id when 7 then 1 else 0 end) as 5 14FROM 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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
サンプルデータが不十分で状況が確認できません
そもそもの定義をNULL不可にして初期値0にするのはどうでしょう。
要件次第かもしれませんが、その要件詳細(前提条件等も)がほとんど書かれてないようにも見えますので。
ありがとうございます!
`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,
失礼、集計後の表で存在しない場合にnullになるから、ということですね。

回答1件
あなたの回答
tips
プレビュー