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

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

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

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

SQL

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

Q&A

解決済

2回答

1180閲覧

[SQL基本] limitで出力行数を制限するSQLを、unionで連結する方法

neeg

総合スコア68

PostgreSQL

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

SQL

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

0グッド

0クリップ

投稿2023/11/28 10:21

実現したいこと

SQLで、limitを使用して出力行数を制限している複数のクエリーを、unionで連結して出力する方法を知りたいです。
DBはPostgreSQLです。

前提

具体的なイメージとしては、
「各部門の売り上げベスト3の社員の一覧を出力する」というようなことをしたいです。

select name, sales from emp where dept='営業1課' order by sales desc limit 3 union select name, sales from emp where dept='営業2課' order by sales desc limit 3 union select name, sales from emp where dept='営業3課' order by sales desc limit 3 union select name, sales from emp where dept='営業4課' order by sales desc limit 3 ;

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

実際にこれを実行すると

"union"またはその近辺で構文エラー

となります。

補足情報(FW/ツールのバージョンなど)

PostgreSQLのバージョンは15です。
ただ、これは私がSQLの基本を理解できていないからわからないのだと思っています。
よろしくご教示いただきたく、お願いいたします。

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

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

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

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

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

guest

回答2

0

質問のSQL構成だと、組織の変更都度、メンテナンスが必要になります。
Window関数を利用する方が良いでしょう。
※同率扱いの考慮が必要なら、rank()やdense_rank()を使用します。

SQL

1select * 2from ( 3 select dept, name, sales 4 , row_number() over(partition by dept order by sales desc) seq 5 from emp 6) t 7where seq <= 3

投稿2023/11/30 04:43

sazi

総合スコア25430

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

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

0

ベストアンサー

かっこをつけてあげればいいです。
(select name, sales from emp where dept='営業1課' order by sales desc limit 3)
union
(select name, sales from emp where dept='営業2課' order by sales desc limit 3)
union
(select name, sales from emp where dept='営業3課' order by sales desc limit 3)
union
(select name, sales from emp where dept='営業4課' order by sales desc limit 3)
;

投稿2023/11/28 10:28

bbtotak

総合スコア9

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

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

neeg

2023/11/28 10:30

本当だ! ありがとうございます!!!!
bbtotak

2023/11/28 10:37

よかったです。 あと、ソート順が指定していないので、例えば以下のようにすれば、各課売上上位3名をさらに売り上げ順に並べたり、目的に応じてソート順は指定したほうが見栄えいいと思います。ご検討ください。 SELECT * FROM (上のSQL) ORDER BY sales desc
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問