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

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

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

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

2回答

650閲覧

Class毎にグループ分けして、それぞれCountryの順番が高い物を一つ抽出するSQLを書きたいのですが

yuujiMotoki

総合スコア90

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2023/03/13 21:43

実現したいこと

以下のようなテーブルがあります。ここでCountryは、別に決めたソート順があります。

欲しい結果は下記です。

JPN → USA → KOR の順で、一番最初の一つだけを抽出したい

csscountry
BedCHN
ChairJPN
SofaKOR
TableJPN

該当のソースコード

sql

1CREATE TABLE furniture ( 2 css VARCHAR(10), 3 Country VARCHAR(3), 4 number VARCHAR(15) 5); 6 7INSERT INTO furniture (css, Country, number) VALUES 8('Chair', 'JPN', '9P5X-8HJ5-L2QP'), 9('Chair', 'USA', 'A8C5-H4U6-XU2Q'), 10('Chair', 'KOR', 'V3J6-S5K3-U6W3'), 11('Table', 'JPN', 'F5P5-K6NS-8Q2Q'), 12('Table', 'USA', 'G4C5-K2Q2-X9KP'), 13('Table', 'FRA', 'A7C7-H5N5-L2P2'), 14('Sofa', 'KOR', 'O9K3-H3J3-V6N2'), 15('Sofa', 'USA', 'G2P3-U3H9-X3V3'), 16('Sofa', 'KOR', 'M6U2-V2Q2-R2Q2'), 17('Bed' , 'CHN' ,'A5L2-K2V6-K5K5'), 18('Bed' , 'FRA' ,'G8N7-H9X5-V7P2'); 19

試したこと

SELECT DISTINCT on (css) *, CASE Country WHEN 'JPN' THEN 1 WHEN 'USA' THEN 2 WHEN 'KOR' THEN 3 ELSE 4 END as x FROM funiture ORDER BY x

DistinctでCSSを限定しています。
ORDER BYをcssにしないと怒られます。

ERROR: SELECT DISTINCT ON expressions must match initial ORDER BY expressions LINE 1: SELECT DISTINCT on (css) *, ^

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

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

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

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

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

guest

回答2

0

エラーにしたがって、ORDER BY css, x としてあげればいいと思います。

もしくは、x を SELECT する必要もなさそうなので、ORDER BY のところに CASE ... END を書くのでもいいと思いました。

sql

1SELECT DISTINCT on (css) * 2FROM furniture 3ORDER BY css, CASE Country WHEN 'JPN' THEN 1 WHEN 'USA' THEN 2 WHEN 'KOR' THEN 3 ELSE 4 END;

投稿2023/03/14 05:09

編集2023/03/14 05:11
bsdfan

総合スコア4601

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

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

0

ソート用に国のリストをテーブルにしておくほうがよいかもしれません
またSQLのデータには原則順番はないため、「一番最初」を担保するなんらかのカラム(もしくは条件)が必要です

参考

SQL

1CREATE TABLE furniture ( 2 id int primary key auto_increment, 3 css VARCHAR(10), 4 country VARCHAR(3), 5 number VARCHAR(15) 6); 7INSERT INTO furniture (id,css,country, number) VALUES 8(1,'Chair', 'JPN', '9P5X-8HJ5-L2QP'), 9(2,'Chair', 'USA', 'A8C5-H4U6-XU2Q'), 10(3,'Chair', 'KOR', 'V3J6-S5K3-U6W3'), 11(4,'Table', 'JPN', 'F5P5-K6NS-8Q2Q'), 12(5,'Table', 'USA', 'G4C5-K2Q2-X9KP'), 13(6,'Table', 'FRA', 'A7C7-H5N5-L2P2'), 14(7,'Sofa', 'KOR', 'O9K3-H3J3-V6N2'), 15(8,'Sofa', 'USA', 'G2P3-U3H9-X3V3'), 16(9,'Sofa', 'KOR', 'M6U2-V2Q2-R2Q2'), 17(10,'Bed' , 'CHN' ,'A5L2-K2V6-K5K5'), 18(11,'Bed' , 'FRA' ,'G8N7-H9X5-V7P2'); 19 20 21create table country( 22id int primary key, 23sort int null, 24cname varchar(20)); 25create table country( 26id int primary key, 27sort int null, 28cname varchar(20)); 29 30insert into country values 31(1,null,'CHN'), 32(2,1,'JPN'), 33(3,3,'KOR'), 34(4,2,'USA'); 35 36 37select * from furniture as t1 38left join country as t2 39on t1.country=t2.cname 40where not exists (select 1 from furniture where t1.country=country and t1.id>id) 41order by sort is null asc ,sort asc

投稿2023/03/14 00:46

編集2023/03/14 05:26
yambejp

総合スコア115034

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問