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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

737閲覧

php、mysqlを使用し配列の質問です。

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/11/27 12:34

zaiseki、idouのデータを利用し下記の出力の様に月別に在籍数を表示したい。

やりたいこと
出力
bumon :aa部門
1月 2月
入社 1 0
退社 0 1
在籍 11 10

bumon :bb部門
1月 2月
入社 0 0
退社 0 2
在籍 20 18

bumon :cc部門
1月 2月
入社 0  3
退社 0 0
在籍 10 13

このように部門別、月別に在籍数を表示させたい。

利用するデータは下記の2つ
zaiseki:201712末の部門ごとの在籍数
Idou:2018の入退社のデータ

‘zaikeki’ (neme’,’zaiseki’)
‘aa部門’,’10’
‘bb部門’,’20’
‘cc部門’,’10’

‘Idou’(‘bumon’,’sutatus’,’date’
‘aa部門’,’入社’,’2018-01-01’
‘bb部門’,退社’,’2018-02-01’
‘bb部門’,退社’,’2018-02-01’
‘cc部門’,’入社’,’2018-02-01’
‘cc部門’,’入社’,’2018-02-01’
‘cc部門’,’入社’,’2018-02-01’
‘aa部門’,’退社’,’2018-02-20’

SELECT bumon AS ‘部門’,
COUNT(CASE WHEN date_format(date,’%Y%m’)=‘201801’ THEN 1 ELSE null END) as ’01月’,
COUNT(CASE WHEN date_format(date,’%Y%m’)=‘201802’ THEN 1 ELSE null END) as ’02月’,
COUNT(CASE WHEN date_format(date,’%Y%m’)=‘201803’ THEN 1 ELSE null END) as ’03月’,

COUNT(CASE WHEN date_format(date,’%Y%m’)=‘201812’ THEN 1 ELSE null END) as ’12月’
FORM idou
group by name, status

上記のSQLでCOUNTを取り’idou’のデータを月毎に「入社」「退社」に集計することはできたのですが、
zaisekiのデータを含めての計算式をどの様に書いていいのか検討がつきません。

お手数おかけしますが上記の内容をお教授お願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/11/28 00:37

タイプミスが多いこと、識別子として同一としてみていいのかどうかあやふやなので、この状況だと回答しづらいです。CREATE TABLE文やINSERT INTO文などで第三者も再現できるようなサンプルデータ提供が望ましいです。
退会済みユーザー

退会済みユーザー

2018/11/28 00:54

idouテーブルのdateはDATE型とかTIMESTAMP型ですか? 日付時刻データはそれにふさわしいデータ型を使ってください。年や月の抽出が楽になり、値の比較もしやすくなります。
yambejp

2018/11/28 03:14

この構成だと相当むりがあります。テーブルの仕様は変更可能ですか?
退会済みユーザー

退会済みユーザー

2018/11/28 03:59 編集

返信遅れてすみません テーブルの変更可能です。 タイプミスについても申し訳ございません。
退会済みユーザー

退会済みユーザー

2018/11/28 03:56

テーブルの変更可能です。
guest

回答1

0

ベストアンサー

とりあえず最大限オリジナルに近づけました

  • 元データ

SQL

1create table bumon (bid int primary key,bname varchar(20),zaiseki int); 2insert into bumon values 3(1,'aa部門',10), 4(2,'bb部門',20), 5(3,'cc部門',10); 6 7create table idou(bname varchar(20),status varchar(20),d date); 8insert into idou values 9('aa部門','入社','2018-01-01'), 10('bb部門','退社','2018-02-01'), 11('bb部門','退社','2018-02-01'), 12('cc部門','入社','2018-02-01'), 13('cc部門','入社','2018-02-01'), 14('cc部門','入社','2018-02-01'), 15('aa部門','退社','2018-02-20');
  • view

再利用性を考えビューをつくっておきます

SQL

1create view list as 2select bname,date_format(d,'%Y%m') as d,status,sum(case status when '入社' then 1 when '退社' then -1 end) as num from idou group by bname,status,d 3union all select bname,'201801','在籍',zaiseki from bumon; 4
  • 結果

SQL

1select * from list;
bnamedstatusnum
aa部門201802退社-1
aa部門201801入社1
bb部門201802退社-2
cc部門201802入社3
aa部門201801在籍10
bb部門201801在籍20
cc部門201801在籍10
  • 入退社と在庫を別々に拾ってunionする

SQL

1select t3.bname,t3.status 2,coalesce(sum((d2='201801')*abs(num)),0) as `201801` 3,coalesce(sum((d2='201802')*abs(num)),0) as `201802` 4 from ( 5select t1.bname,t2.status from 6(select distinct bname from list) as t1, 7(select distinct status from list where status in ('入社','退社')) as t2 8) as t3 left join list as t4 on t3.bname=t4.bname and t3.status=t4.status 9group by bname,status 10 11union all 12select t3.bname,'在籍' 13,sum((d2 between '201801' and '201801')*num) 14,sum((d2 between '201801' and '201802')*num) 15 from ( 16select t1.bname,t2.status from 17(select distinct bname from list) as t1, 18(select distinct status from list) as t2 19) as t3 left join list as t4 on t3.bname=t4.bname and t3.status=t4.status 20group by bname 21order by bname,case status when '入社' then 1 when '退社' then 2 when '在籍' then 3 end
  • 結果
bnamestatus201801201802
aa部門入社10
aa部門退社01
aa部門在籍1110
bb部門入社00
bb部門退社02
bb部門在籍2018
cc部門入社03
cc部門退社00
cc部門在籍1013

投稿2018/11/28 09:31

yambejp

総合スコア114843

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

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

退会済みユーザー

退会済みユーザー

2018/11/29 08:38

問題なく対応できました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問