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

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

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

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

PHP

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

MariaDB

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

Q&A

解決済

2回答

418閲覧

データベースでカラムの合計値とその内訳も合わせて表示したい

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

PHP

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

MariaDB

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

0グッド

0クリップ

投稿2019/02/18 13:14

編集2019/02/21 00:01

MariaDB ver15.1

MySQLデータベースのカラム名、nickname、date、hourに、HTMLフォームを使って勤務者、勤務日、勤務時間を入れていきます。

このデータベースを使って勤務者ごとの直近7日間のhourの合計時間の多い人から並び替えて、nicknameとhourの合計時間、7日間それぞれのhourの値を表示する表を作るにはどんなSQL文を作ればよいでしょうか?

SELECT nickname,sum(hour) FROM study_hour where date between date(now() - INTERVAL 7 day) and date(now()) GROUP BY nickname ORDER BY sum(hour) DESC;

こうすれば、合計勤務時間の多い人順でnicknameとhourの合計時間を、表示できるのですが、
勤務日とその日の勤務時間をどのように表示すればいいのかわかりません。

具体的に表示したい表を書くと以下の通りです。
nickname|1/1|1/2|1/3|1/4|1/5|1/6|1/7|sum(hour)
甲|8|8|8|8|8|8|0|56
乙|8|8|8|8|8|7|0|55
丙|8|8|8|8|8|6|0|54

1週間の日付表示は、もしかするとPHPで表示した方がいいのかもしれません・・・
よろしくお願いします。

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

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

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

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

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

m.ts10806

2019/02/18 21:43

細かい指摘で申し訳ないですが、下記、不要です。初心者アイコンつけられてますし、冒頭でそこを断られると読む気なくす人もいます。それならそれだけ書く労力をわかりやすい内容を書くために割いてください。 >超初心者の、初質問です。 質問自体わかりにくくてすみません。
退会済みユーザー

退会済みユーザー

2019/02/19 11:09

以後、気をつけます。 ご指摘ありがとうございました。
m.ts10806

2019/02/19 20:27

質問は編集できるこで適宜ご対応ください。(以後、と後回しにすると大抵次の時には忘れてます…)
退会済みユーザー

退会済みユーザー

2019/02/21 00:00

なんども、すみません。 質問、修正できるのですね! 修正します! 勉強になりますm(_ _)m
guest

回答2

0

select 項目の名称まで可変にするには動的SQLでないと無理です。
タイトルが必要ならPHPで基準の日からの相対で生成するとか。

SQL

1SELECT nickname, date(now()) as base_date, sum(hour) 2 , sum(case when date=date(now() - INTERVAL 6 day) then hour else 0 end) as date6 3 , sum(case when date=date(now() - INTERVAL 5 day) then hour else 0 end) as date5 4 , sum(case when date=date(now() - INTERVAL 4 day) then hour else 0 end) as date4 5 , sum(case when date=date(now() - INTERVAL 3 day) then hour else 0 end) as date3 6 , sum(case when date=date(now() - INTERVAL 2 day) then hour else 0 end) as date2 7 , sum(case when date=date(now() - INTERVAL 1 day) then hour else 0 end) as date1 8 , sum(case when date=date(now()) then hour else 0 end) as date0 9FROM study_hour 10where date between date(now() - INTERVAL 6 day) and date(now()) 11GROUP BY nickname, date(now()) 12ORDER BY sum(hour) DESC

抽出条件が8日分だったので、1週間分に補正掛けてます。

投稿2019/02/18 13:58

sazi

総合スコア25184

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

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

退会済みユーザー

退会済みユーザー

2019/02/18 14:45

迅速なご回答ありがとうございます。 まだわからない点がありますので教えていただけると幸いです。 ご回答いただいたコードには、date6 date5・・・date1となっておりますが、 ブラウザ表示をしたとき、現在の日付を基準とした直近7日分を表示したいと考えております。 つまり今(2/18)、ブラウザ表示した場合、 nickname|2/12|2/13|2/14|2/15|2/16|2/17|2/18|sum(hour) 甲|8|8|8|8|8|8|0|48 乙|8|8|8|8|8|7|0|47 丙|8|8|8|8|8|6|0|46 明日(2/19)、ブラウザ表示する場合、 nickname|2/13|2/14|2/15|2/16|2/17|2/18|2/19|sum(hour) 甲|8|8|8|8|8|0|4|44 乙|8|8|8|8|7|0|4|43 丙|8|8|8|8|6|0|4|42 といった感じです。 言葉足らずですみませんでした。 (最初の質問でsum(hour)の値も間違っていました。かさねがさねすみません)
sazi

2019/02/18 15:43

SQLの取得結果をどのようにブラウザに展開するのかは答えかねます。 この質問内容では正直ブラウザに表示する部分の回答は付きにくいと思いますよ。
sazi

2019/02/19 02:01

SQLで希望の編集を行うのに必要な情報は取得できると思いますので、後はPHPなりで表示用の編集を行えば良いのだと思いますが。
guest

0

ベストアンサー

任意のカラム名を自動的につけたいならprocedureが良いでしょう。

  • 元データ

SQL

1create table tbl ( 2id int primary key auto_increment 3,nickname varchar(10) 4,d date,work double 5,unique key(nickname,d) 6); 7insert into tbl(nickname,d,work) values 8('X','2019-02-12',8), 9('Y','2019-02-12',8), 10('Z','2019-02-12',8), 11('X','2019-02-13',8), 12('Y','2019-02-13',8), 13('Z','2019-02-13',8), 14('X','2019-02-14',8), 15('Y','2019-02-14',8), 16('Z','2019-02-14',8), 17('X','2019-02-15',8), 18('Y','2019-02-15',8), 19('Z','2019-02-15',8), 20('X','2019-02-16',8), 21('Y','2019-02-16',8), 22('Z','2019-02-16',8), 23('X','2019-02-17',8), 24('Y','2019-02-17',7), 25('Z','2019-02-17',6), 26('X','2019-02-19',4), 27('Y','2019-02-19',4), 28('Z','2019-02-19',4), 29('X','2019-02-20',1), 30('Y','2019-02-20',2), 31('Z','2019-02-20',3);
  • procedure作成

SQL

1drop procedure if exists shukei; 2delimiter // 3create procedure shukei(in d date) 4begin 5set @d:=d; 6set @sql=""; 7set @sql=concat(@sql,"select nickname"); 8set @sql=concat(@sql,",sum((d=@d-interval 6 day)*work) as `",@d-interval 6 day,"`"); 9set @sql=concat(@sql,",sum((d=@d-interval 5 day)*work) as `",@d-interval 5 day,"`"); 10set @sql=concat(@sql,",sum((d=@d-interval 4 day)*work) as `",@d-interval 4 day,"`"); 11set @sql=concat(@sql,",sum((d=@d-interval 3 day)*work) as `",@d-interval 3 day,"`"); 12set @sql=concat(@sql,",sum((d=@d-interval 2 day)*work) as `",@d-interval 2 day,"`"); 13set @sql=concat(@sql,",sum((d=@d-interval 1 day)*work) as `",@d-interval 1 day,"`"); 14set @sql=concat(@sql,",sum((d=@d)*work) as `",@d,"`"); 15set @sql=concat(@sql,",sum(( d between @d - interval 6 day and @d)*work) as sum_week "); 16set @sql=concat(@sql,"from tbl "); 17set @sql=concat(@sql,"where d between @d - interval 6 day and @d "); 18set @sql=concat(@sql,"group by nickname "); 19set @sql=concat(@sql,"order by sum_week desc "); 20prepare stmt from @sql; 21execute stmt; 22end 23// 24delimiter ;
  • 抽出

SQL

1call shukei('2019-02-18');

※引数に任意の日付を指定すれば自動で1週間分のデータが取れる
※例外処理など一切無視しているので適宜調整が必要

投稿2019/02/19 01:01

yambejp

総合スコア114810

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

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

退会済みユーザー

退会済みユーザー

2019/02/21 00:03

ありがとうございます! ずっと、悩んでいたことが解決できました! 回答を参考にしながらやってみたらうまく表示できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問