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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

MariaDB

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

Q&A

解決済

3回答

4773閲覧

sql(mariaDB)で年度ごとに集計したい

uep3vjz9wp

総合スコア20

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

MariaDB

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

0グッド

0クリップ

投稿2019/01/10 07:29

いつもお世話になります。お忙しいところ恐縮です。よろしくお願いします。

SQLバージョン:5.5.60-MariaDB

テーブルが2つあります。
table_eigyou
(営業のたびにデータが増えるのでshainbangou1に同じ番号が何度も入力される。)
int smallint date   ←データ型

idshainbangou1eigyouday
132015-06-2
252017-11-25
332018-12-5
...
...

table_shain (社員の番号、名前、所属)
int smallint varchar varchar  ←データ型

id_sbangoushainshozoku
13Aさん東京支店
25Eさん福岡支店
....
....
....

上記2つのテーブルを結合して「年度ごと」の各社員の営業回数(eigyouday)を集計したいと思っています。
望む結果は以下です。

shainbangou1shainshozoku2016年度2017年度2018年度
3Aさん東京支店5115
5Eさん福岡支店82035
......
......
......

以下のSQLを実行しましたが望む結果が出ません。ご教示お願いいたします。

sql

1SELECT shainbangou1, shain, shozoku, 2 CASE WHEN DATE_FORMAT(eigyouday,'%m') < 4 THEN DATE_FORMAT(eigyouday,'%Y') -1 3 ELSE DATE_FORMAT(eigyouday,'%Y') 4 END 5 COUNT(*) AS kazoeru 6 FROM table_eigyou AS t1 7 JOIN table_shain AS t2 8 ON t1.shainbangou1 = t2.bangou 9 WHERE eigyouday 10 GROUP BY shainbangou1,shain,shozoku

実行結果
MySQL のメッセージ:
1064 - Something is wrong in your syntax : 'COUNT(*) AS kazoeru

sql

1SELECT shainbangou1, shain, shozoku, 2COUNT(*) AS kazoeru 3FROM table_eigyou AS t1 4JOIN table_shain AS t2 5ON t1.shainbangou1 = t2.bangou 6WHERE eigyouday BETWEEN '2017-04-01' AND '2018-03-31' 7GROUP BY shainbangou1,shain,shozoku 8

実行結果

shainbangou1shainshozokukazoeru
3Aさん東京支店5
5Eさん福岡支店8

件数に間違いはありませんが、単年度のみとなり毎年度の集計ができません。

sql

1SELECT shainbangou1, shain, shozoku, 2COUNT(*) AS kazoeru 3FROM table_eigyou AS t1 4JOIN table_shain AS t2 5ON t1.shainbangou1 = t2.bangou 6WHERE eigyouday(BETWEEN '2017-04-01' AND '2018-03-31') 7OR(BETWEEN '2018-04-01' AND '2019-03-31') 8GROUP BY shainbangou1,shain,shozoku

実行結果
1064 - Something is wrong in your syntax : 'BETWEEN '2017-04-01' AND '2018-03-31')
OR(BETWEEN '2018-04-01' AND '2019-03-31'' 付近 : 6 行目

sql

1SELECT shainbangou1, shain, shozoku, 2 COUNT( CASE WHEN DATE_FORMAT(eigyouday,'%m') < 4 THEN DATE_FORMAT(eigyouday,'%Y') -1 3 ELSE DATE_FORMAT(eigyouday,'%Y') 4 END ) AS kazoeru 5 FROM table_eigyou AS t1 6 JOIN table_shain AS t2 7 ON t1.shainbangou1 = t2.bangou 8 WHERE eigyouday 9 GROUP BY shainbangou1,shain,shozoku

実行結果

shainbangou1shainshozokukazoeru
7iさん北海道支店15
15sさん大阪支店30

件数に間違いはありませんが、全ての年度が合算されてしまいます。

sql

1SELECT shainbangou1, shain, shozoku, 2 COUNT(*) AS kazoeru 3 FROM table_eigyou AS t1 4 JOIN table_shain AS t2 5 ON t1.shainbangou1 = t2.bangou 6 WHERE 7 ( CASE WHEN DATE_FORMAT(eigyouday,'%m') < 4 THEN DATE_FORMAT(eigyouday,'%Y') -1 8 ELSE DATE_FORMAT(eigyouday,'%Y') 9 END AS nendo ) 10 GROUP BY shainbangou1,shain,shozoku 11

実行結果
1064 - Something is wrong in your syntax : 'AS nendo )
GROUP BY shainbangou1,shain,shozoku LIMIT 0, 25' 付近 : 9 行目

ご教示お願いいたします。

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

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

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

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

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

Orlofsky

2019/01/10 07:55

https://teratail.com/questions/167224 のように使っているテーブルの CREATE TABLE と INSERT で提示するとSQLをすぐ実行できるので、適切なコメントが付き易いかと。
uep3vjz9wp

2019/01/10 08:46

リンク先勉強になりました。今回はご迷惑をおかけしました。今後は気をつけます。ありがとうございました。
guest

回答3

0

ベストアンサー

年度別の集計は以下の様になります。

SQL

1SELECT shainbangou1, shain, shozoku 2 , DATE_FORMAT(date_sub(eigyouday, INTERVAL 3 MONTH),'%Y') as nendo 3 , COUNT(*) AS kazoeru 4FROM table_eigyou AS t1 left JOIN table_shain AS t2 5 ON t1.shainbangou1 = t2.bangou 6GROUP BY shainbangou1,shain,shozoku, DATE_FORMAT(date_sub(eigyouday, INTERVAL 3 MONTH),'%Y')

年度をカラムとして展開するのはクロス集計で以下の様になります。

SQL

1SELECT shainbangou1, shain, shozoku 2 , sum((DATE_FORMAT(date_sub(eigyouday, INTERVAL 3 MONTH),'%Y')='2017')) as count_2017 3 , sum((DATE_FORMAT(date_sub(eigyouday, INTERVAL 3 MONTH),'%Y')='2018')) as count_2018 4FROM table_eigyou AS t1 left JOIN table_shain AS t2 5 ON t1.shainbangou1 = t2.bangou 6GROUP BY shainbangou1,shain,shozoku

カラムが固定になり、取得する年度を変更するには動的SQLにする必要があるので、
最初のSQLで取得して加工する方が良いかもしれません。

投稿2019/01/10 08:15

編集2019/01/10 08:16
sazi

総合スコア25184

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

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

uep3vjz9wp

2019/01/10 08:34

実行させていただき、問題ございませんでした。ありがとうございますおかげさまで助かりました。2つのコードを今後のためにもよく勉強させていただきます。
guest

0

本質的な話をすれば集計単位に「年度」が必要であれば
個別データに年度カラムを埋め込んでおくと効率的で汎用化しやすいです。
とくに決算月は会社によって異なるケースが多く、4月から始まる
いわゆるスクールカレンダーを前提は危険です。

データのもたせ方は2018年度より、第10期など会社創業からの
営業期ごとにする手もあります

投稿2019/01/11 01:45

yambejp

総合スコア114806

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

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

0

1064 - Something is wrong in your syntax : 'COUNT(*) AS kazoeru

COUNT(*) AS kazoeru
の前に , がありません。

投稿2019/01/10 07:55

Orlofsky

総合スコア16415

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

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

uep3vjz9wp

2019/01/10 08:43

,COUNT(*) AS kazoeru ですね。 ご指摘ありがとうございます。修正して実行したところ望む結果とはちょっと違いましたがエラーは出ませんでした。勉強不足でした。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問