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

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

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

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

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

Q&A

解決済

3回答

2945閲覧

MySQLのdate型が無意味な文字列になってしまいます。

ky_46

総合スコア92

MySQL

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

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

1グッド

0クリップ

投稿2016/12/13 08:03

###前提・実現したいこと
入荷数、出荷数、日付を保存した、次のようなデータベースがMySQL上にあります。
id 年月日 商品番号 入庫 出庫
1 2016-12-12 100 10 0
2 2016-12-12 101 10 5
3 2016-12-12 106 0 5
4 2016-12-12 107 0 0
5 2016-12-11 100 0 5
6 2016-12-11 101 0 5
7 2016-12-11 106 10 3
8 2016-12-11 107 0 0
9 2016-12-10 100 0 0
10 2016-12-10 101 0 0
11 2016-12-10 106 0 1
12 2016-12-10 107 0 0
13 2016-12-09 100 5 0
14 2016-12-09 101 5 0
15 2016-12-09 106 0 1
16 2016-12-09 107 10 0

これから、クロス集計のようにして、各商品が最初に入庫した日付と、最後に出庫した日付の一覧データを得たいと思います。

商品番号 最初入庫 最終出庫
100 2016-12-09 2016-12-11
101 2016-12-09 2016-12-12
106 2016-12-11 2016-12-12
107 2016-12-09

希望としては、このようになります

そこで、Googleで色々SQLを調べた結果、次のようなSQLを組んでみました。

SELECT
商品番号,
Max(case when 出庫 > 1 then 年月日 else null end) as 最終出庫
FROM inventory_all_data
WHERE 年月日 > '2014-12-1'
GROUP BY 商品番号
ORDER BY 商品番号
;

###発生している問題・エラーメッセージ

このSQLは、phpmyadmin で問題無く実行され、結果も得られたのですが

商品番号 最終出庫
100 323031362d31322d3132
101 323031362d30382d3135
106 323031362d31312d3031
107 323031362d31322d3132

のように、何かコードのような文字列になってしまいます。

###試したこと
MySQL Data型 文字化けなどで検索してみましたが、何等かの状況により、Data型がこのような文字列になる事例を発見できませんでした。

希望するように、日付のMAXやMINを組み込んで、日付の最も小さい、或いは最も大きい値を一覧で得る事は可能でしょうか?

MySQLは、Centos6.8で構成したサーバー上にあり、windows10 のパソコンからphpmyadminを使用して、SQLを通過させ、結果をえました。

よろしくお願いいたします。

KiyoshiMotoki👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

なんかアスキーコードで出力されていますね。
323031362d31322d3132

2016-12-12

環境がないので試せませんが、キャストしてみるとか。

SQL

1CAST(Max(case when 出庫 > 1 then 年月日 else null end) AS DATE) as 最終出庫 2

投稿2016/12/13 08:37

ttyp03

総合スコア16998

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

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

ky_46

2016/12/13 08:55

ありがとうございます。 アスキーコードとは気がつきませんでした。 SELECT `商品番号`, CAST(Max(case when `出庫` > 0 then `年月日` else null end) AS DATE) as 最終出庫, CAST(Min(case when `入庫` > 0 then `年月日` else null end) AS DATE) as 最初入荷 FROM `inventory_all_data` WHERE `年月日` > '2014-12-1' GROUP BY `商品番号` ORDER BY `商品番号` ; としたところ、出荷で最も大きな日付と、入荷で最も小さい日付を抽出できました。 ありがとうございました。
KiyoshiMotoki

2016/12/13 09:12

横から失礼します。 ky_46様 お手数ですが、試しに以下のSQLを実行してどのように表示されるか、確認していただくことは可能でしょうか? どうも、ご質問の現象はカラム名の日本語が影響しているのではないか?と思えますので。 CREATE TABLE test_inventory_all_data ( id INT PRIMARY KEY AUTO_INCREMENT, `date` DATE, number int, `in` int, `out` int ); INSERT INTO test_inventory_all_data VALUES ( 1, '2016-12-12', 100, 10, 0), ( 2, '2016-12-12', 101, 10, 5), ( 3, '2016-12-12', 106, 0, 5), ( 4, '2016-12-12', 107, 0, 0), ( 5, '2016-12-11', 100, 0, 5), ( 6, '2016-12-11', 101, 0, 5), ( 7, '2016-12-11', 106, 10, 3), ( 8, '2016-12-11', 107, 0, 0), ( 9, '2016-12-10', 100, 0, 0), (10, '2016-12-10', 101, 0, 0), (11, '2016-12-10', 106, 0, 1), (12, '2016-12-10', 107, 0, 0), (13, '2016-12-09', 100, 5, 0), (14, '2016-12-09', 101, 5, 0), (15, '2016-12-09', 106, 0, 1), (16, '2016-12-09', 107, 10, 0); SELECT number, MIN(CASE WHEN `in` > 0 THEN `date` ELSE NULL END) first_in, MAX(CASE WHEN `out` > 0 THEN `date` ELSE NULL END) last_out FROM test_inventory_all_data GROUP BY number ORDER BY number;
ky_46

2016/12/13 09:25

ありがとうございます。 number first_in last_out 100 323031362d31322d3039 323031362d31322d3131 101 323031362d31322d3039 323031362d31322d3132 106 323031362d31322d3131 323031362d31322d3132 107 323031362d31322d3039 NULL 結果ですが、上記のように、やはりASCIIコードになりました。 どうも私のphpmyadminの文字コードの設定に問題があるようです。
ky_46

2016/12/13 09:29

すみません。ことのついでに、このSQLを、AccessからパススルークエリーでMySQLに送ってみましたが、やはり文字コードで出力されました。 一方、CASTを組み込むと、正常に日付として出力されました。
KiyoshiMotoki

2016/12/13 10:01

ky_46様 検証いただき、ありがとうございます。 カラム名の日本語を排除しても文字化けするとは、不思議な現象ですね。。 phpmyadminからも、Accessからも文字化けが発生するとなると、 ODBC の設定の問題なのかもしれませんね。 ただ、ざっと調べてみた限りでは(mouto様の回答の他には)同様の事象は見当たりませんでした。。 ともあれ、私も勉強させていただきました。 重ねてお礼申し上げます。
guest

0

同じような事象があったようです。私の環境でも再現しないので、なんとも言えませんが、phpmyadminの文字コードの設定が問題なのかもしれません。

参考ページ

投稿2016/12/13 08:50

motuo

総合スコア3027

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

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

ky_46

2016/12/13 09:17

ありがとうございます。 ttyp03 さまのキャストでとりあえず、日付に変換できました。 ありがとうございました。
guest

0

sql

1SELECT 2 `商品番号` 3 , `最初出庫` 4 , `最終出庫` 5FROM 6( 7 SELECT 8 `商品番号` 9 , MIN(`年月日`) as `最初出庫` 10 , NULL as `最終出庫` 11 FROM `inventory_all_data` 12 WHERE `入庫` > 0 13 GROUP BY `商品番号` 14 15 UNION 16 17 SELECT 18 `商品番号` 19 , NULL as `最初出庫` 20 , MAX(`年月日`) as `最終出庫` 21 FROM `inventory_all_data` 22 WHERE `出庫` > 0 23 GROUP BY `商品番号` 24) M 25GROUP BY M.`商品番号`

※検証のしようがないので、未検証。

投稿2016/12/13 08:26

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ky_46

2016/12/13 09:03

ありがとうございます。 こちらも通り、同じ結果を得る事ができました。 同じ結果が得られましたので、どちらもベストアンサーにしたいのですが、ここはかかった時間という事で、0.2996 秒 対 2.6006 秒 で、申し訳ありませんがベストアンサーにできませんでした。お許しください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問