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

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

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

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

SQL

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

Q&A

解決済

3回答

22387閲覧

複数レコードを1レコードにまとめる方法

usagi518

総合スコア18

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

SQL

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

0グッド

1クリップ

投稿2019/01/23 06:19

編集2019/01/23 06:53

商品名 入荷日    価格 産地 都道府県 国名
りんご 2019/05/01 100 国内 千葉 null
りんご 2019/03/01 100 国外 null アメリカ
ばなな 2019/01/01 150 国内 沖縄 null
ばなな 2019/02/01 170 国外 null フィリピン
めろん 2019/11/01 150 国内 北海道 null

上記のテーブルがあります。
これを以下のような形で取得したいです。

名称 入荷日     価格 国内産地 国外産地
りんご 2019/05/01 100 千葉 アメリカ
ばなな 2019/02/01 170 沖縄 フィリピン
メロン 2019/11/01 150 北海道 null

※入荷日は最も未来の日付を設定します
※同一名称のデータは最大2つです。(上記でいうところの「りんご」「ばなな」)
※取得時の価格は入荷日と同じレコードの価格です
※入荷日が同じで価格が異なる場合は価格が高い方を取得します

前回こちら(https://teratail.com/questions/170177)で質問させていただき、
既存の解決策を見ながらSQLを作成したのですがうまくいきませんでした...
(「group byの式ではありません」エラーとなりました)

SQL

1select 2 名称 3 , 入荷日 4 , 価格 5 ,(select 都道府県 from フルーツテーブル FT where FT.名称=FT2.名称 and FT.都道府県=FT2.都道府県) as 国内産地 6 ,(select 国名 from フルーツテーブル FT where FT.名称=FT2.名称 and FT.国名=FT2.国名) as 国外産地 7from フルーツテーブル FT2 8group by 9 名称 10 , 入荷日 11 , 価格

お手数おかけして大変申し訳ないのですが助けていただけませんでしょうか。
よろしくお願いいたします。

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

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

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

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

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

sazi

2019/01/23 06:33

Nullとの比較になっていますが、これがNullでなくて値が変わった時にどうなるかのパターンもし示して下さい。 前回の質問内容より難易度高めです。 SQLなら再帰かなって感じですけど、javaで編集した方が楽そうですね。
ttyp03

2019/01/23 06:47

価格の仕様は?表示している入荷日と同じレコードの価格でしょうか?入荷日が同じで価格が異なる場合はどうするのでしょうか?
usagi518

2019/01/23 06:48

見てくださってありがとうございます! >Nullでなくて値が変わった時にどうなるか 察しが悪い故、ご指摘の内容に沿っているか自信がないのですが 商品名 入荷日    価格 産地 都道府県 国名 りんご 2019/05/01 100 国内 千葉 null ↓update↓ 商品名 入荷日    価格 産地 都道府県 国名 りんご 2019/05/01 100 国外 null メキシコ このようになることはありません。 また、1つのレコードにおいて都道府県・国名両方に値が入る、NULLが入ることはありません。(都道府県・国名どちらか一方にのみ必ず値が入ります) ご指摘の内容と食い違っていましたら大変申し訳ないのですが もう少し詳しくお聞かせ願えませんでしょうか。 javaの方が楽、ですか。前回の質問時に簡略化したデータを書いた私は愚かでした...
usagi518

2019/01/23 06:51

ttyp03さん ご覧いただきありがとうございます! ご指摘の通り「表示している入荷日と同じレコードの価格」です。 入荷日が同じで価格が異なる場合は価格が高い方を取得します。 説明が足らず申し訳ありません!追記します!
guest

回答3

0

ベストアンサー

手打ちで検証もしていないので、集約されるかちょっと不安ですが。

SQL

1select 名称 2 , (select max(価格) from フルーツテーブル where 名称=step3.名称 and 入荷日=step3.最終入荷日) as 最新価格 3 , 国内産地, 国外産地 4from ( 5 select 名称, max(産地別最終入荷日) as 最終入荷日, max(国内産地) as 国内産地, max(国外産地) as 国外産地 6 from ( 7 select 名称, 産地別最終入荷日 8 , (select 都道府県 from フルーツテーブル 9 where 産地='国内' and 名称=step1.名称 and 産地=step1.産地 and 入荷日=step1.産地別最終入荷日 10 ) as 国内産地 11 , (select 国名 from フルーツテーブル 12 where 産地='国外' and 名称=step1.名称 and 産地=step1.産地 and 入荷日=step1.産地別最終入荷日 13 ) as 国外産地 14 from ( 15 select 名称, 産地, max(入荷日) as 産地別最終入荷日 16 from フルーツテーブル FT2 17 group by 名称, 産地 18 ) step1 19 ) step2 20 group by 名称 21) step3

投稿2019/01/23 07:01

編集2019/01/23 07:07
sazi

総合スコア25195

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

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

usagi518

2019/01/23 07:06

ご回答ありがとうございます! やはりそれなりに複雑になりますね... 早速検証させていただきます!お忙しいところありがとうございました!
usagi518

2019/01/23 08:14

解決に至るヒントを多く示してくださったのでベストアンサーとさせていただきます。 みなさま本当にありがとうございました!
guest

0

ぱっとみこうかなと思ったんですが
都道府県と国名を見てわからなくなりました。
りんご 2019/05/01 100 千葉 アメリカ
ばなな 2019/02/01 170 沖縄 フィリピン
↑これはあってるんですかね…

sql

1 2CREATE TABLE Table1 3 ("商品名" varchar2(10), "入荷日" timestamp, "価格" int, "産地" varchar2(10), "都道府県" varchar2(10), "国名" varchar2(20)) 4; 5 6INSERT ALL 7 INTO Table1 ("商品名", "入荷日", "価格", "産地", "都道府県", "国名") 8 VALUES ('りんご', '01-May-2019 12:00:00 AM', 100, '国内', '千葉', NULL) 9 INTO Table1 ("商品名", "入荷日", "価格", "産地", "都道府県", "国名") 10 VALUES ('りんご', '01-Mar-2019 12:00:00 AM', 100, '国外', NULL, 'アメリカ') 11 INTO Table1 ("商品名", "入荷日", "価格", "産地", "都道府県", "国名") 12 VALUES ('ばなな', '01-Jan-2019 12:00:00 AM', 150, '国内', '沖縄', NULL) 13 INTO Table1 ("商品名", "入荷日", "価格", "産地", "都道府県", "国名") 14 VALUES ('ばなな', '01-Feb-2019 12:00:00 AM', 170, '国外', NULL, 'フィリピン') 15 INTO Table1 ("商品名", "入荷日", "価格", "産地", "都道府県", "国名") 16 VALUES ('めろん', '01-Nov-2019 12:00:00 AM', 150, '国内', '北海道', NULL) 17SELECT * FROM dual 18; 19 20select * from Table1 A 21where not exists( 22 select 0 23 from Table1 B 24 where B.商品名=A.商品名 25 and B.入荷日>A.入荷日 26);

投稿2019/01/23 06:49

sousuke

総合スコア3828

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

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

usagi518

2019/01/23 06:56

ご回答ありがとうございます! 取得後は「国内産地」「国外産地」と名前を変えるので大丈夫かと思います。 わざわざSQLを書いてくださりありがとうございます。参考にさせていただきます!
sousuke

2019/01/23 07:02

私の実行結果だと りんご 千葉 NULL ばなな NULL フィリピン になるんですよ。国内と国外両方に値が入ることはありません。 なので取得したいデータ通りにはならないです。 追記でありますが同じ入荷日で違う価格が存在する場合が あるようなので上記のSQLは正しくないです。その場合には対応できません。
usagi518

2019/01/23 07:08

そうなのですね... わざわざコメントくださりありがとうございました。
guest

0

価格の因果関係が不明ですが…

SQL

1SELECT 商品名 名称, MAX(入荷日) 入荷日, MAX(価格) 価格, MAX(都道府県) 国内産地, MAX(国名) 国外産地 2FROM フルーツテーブル 3GROUP BY 商品名

投稿2019/01/23 06:31

hihijiji

総合スコア4150

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

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

usagi518

2019/01/23 06:57

ご回答ありがとうございます! 価格について説明が足りず申し訳ありません...(追記させていただきました) SQL考えてくださりありがとうございます!参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問