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

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

新規登録して質問してみよう
ただいま回答率
85.51%
GROUP BY

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

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

Q&A

解決済

3回答

1539閲覧

ORACLE データをフォーマット変更した年月毎にGROUPBYしたい

azuapricot

総合スコア2341

GROUP BY

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

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

0グッド

0クリップ

投稿2019/01/07 03:07

また大変初歩的な質問で申し訳ないのですが、いくら調べてもやりたいことが実現できなかったのでご助力いただきたいです。

実現したい内容としましては以下になります。

ある地域毎の2017年度の月別使用量と、売上年月をYYYYMMDD形式からYYYYMM形式に変換したものを表示したいです。

イメージ説明
イメージ説明イメージ説明

また現在制作したSQL(簡略化してあります)は以下となります。

SQL

1SELECT 2 建物.郵便番号 3 , 市区町村.市区町村名 4 , SUM(売上.使用量) 5 , 売上.売上年月 6FROM 7 住人マスタ 住人 8 INNER JOIN 建物テーブル 建物 9 ON 建物.建物コード = 住人.建物コード 10 INNER JOIN 市区町村マスタ 市区町村 11 ON 市区町村.市区町村コード = 建物.市区町村コード 12 INNER JOIN 売上テーブル 売上 13 ON 売上.住人コード = 住人.住人コード 14 AND 売上.売上年月 LIKE '2017%' 15GROUP BY 16 建物.郵便番号 17 , 市区町村.市区町村名 18 , 売上.売上年月 19;

TO_CHAR(売上.売り上げ年月, 'YYYYMM') や TO_DATE(売上.売り上げ年月, 'YYYYMM')を使ってみましたが、
SQLエラーとなりうまく売上年月をフォーマット変換して表示ができませんでした。

もしこの表とSQLだけで解決策がわかるかたいらっしゃいましたら、ご教示お願いしたいです。

売上年月はVARCHAR型です。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/01/07 03:51

普通に「oracle 文字列 先頭6文字」とかで検索すれば方法が出てくると思いますが、検索しないのはなぜ?
azuapricot

2019/01/07 04:01

あ、そうか文字列だから日付に直して変換するか、先頭6文字で切り取ればよかったんですね...! 頭の中でYYYYMMで指定するもんだと固定されてしまっていました。
guest

回答3

0

ベストアンサー

売上年月は年月日が格納されていますが、それは文字の書式としてそのように格納されているだけです。
なので意図するところは単に文字型として処理するだけです。

SQL

1SELECT 2 建物.郵便番号 3 , 市区町村.市区町村名 4 , SUM(売上.使用量) 5 , substr(売上.売上年月,1,6) 6FROM 7 住人マスタ 住人 8 INNER JOIN 建物テーブル 建物 9 ON 建物.建物コード = 住人.建物コード 10 INNER JOIN 市区町村マスタ 市区町村 11 ON 市区町村.市区町村コード = 建物.市区町村コード 12 INNER JOIN 売上テーブル 売上 13 ON 売上.住人コード = 住人.住人コード 14 AND 売上.売上年月 LIKE '2017%' 15GROUP BY 16 建物.郵便番号 17 , 市区町村.市区町村名 18 , substr(売上.売上年月,1,6)

投稿2019/01/07 04:06

編集2019/01/07 04:07
sazi

総合スコア25085

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

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

azuapricot

2019/01/07 04:09

既に質問への追記で asahina1979 様が教えてくれていましたが、文字列として処理するだけという簡単なことに気づけていませんでした...。 日付=YYYYMMで変換したらできるという固定概念が邪魔をしていました。 ご提示の通りSQLを修正しまして無事想定通りの結果を取得することができました。
guest

0

売上年月はVARCHAR型です。

ネーミングがデータの実体と一致していないのが敗因です。VARCHAR2(8) なら、SUBSTR(売上年月, 1, 6) でSELECTの並びとGROUP BYに記述すればいいのでは?

VARCHARデータ型は、使用しないでください。かわりにVARCHAR2データ型を使用してください。
日時情報はDATE型を使った方がいい場合は多いです。

投稿2019/01/07 04:11

Orlofsky

総合スコア16415

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

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

azuapricot

2019/01/07 04:16

DBのデータ型は上層部に依頼しないと変更できないので...。 ですが最初の方にこういった型を検討する重要さを身に染みて痛感いたしました。 ありがとうございます。
guest

0

date_formatでできませんか?

投稿2019/01/07 03:31

yambejp

総合スコア114505

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問