teratail header banner
teratail header banner
質問するログイン新規登録

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

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

新規登録して質問してみよう
ただいま回答率
85.30%
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

1回答

814閲覧

PostgreSQL:SQL(SELECT)の作成方法についてご教示お願い致します

n.taka-hjw

総合スコア5

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クリップ

投稿2022/12/20 08:23

編集2022/12/21 00:59

0

0

いつも大変参考にさせていただいております。
今回は、postgresqlのテーブルからどのようなSQLで抽出すればよいか、について質問をさせていただきます。
よろしくお願い致します。

[ TABLE ] create table exdb.t_test ( date_of_use date -- 利用日 ,usage_amount integer -- 利用金額 ,client_cd character varying(10) --顧客コード ,count_of_use integer -- 利用回数 ); [ INSERT DATA ] insert into t_test values('2021-01-01',980,"001",1); insert into t_test values('2021-05-01',1980,"001",2); insert into t_test values('2021-10-01',4580,"002",2); insert into t_test values('2022-04-01',29800,"001",1); insert into t_test values('2022-07-01',15800,"002",2); insert into t_test values('2022-08-01',12800,"003",1);

[ 実現したいSELECT結果 ]
|CD|21年回数|21年金額|22年回数|22年金額|
|001|3|2960|1|29800
|002|1|4580|2|15800
|003|0|0|1|12800

※ここでは2021年~22年のフィールドですが、実際データは2010年から始まり固定項目となります。
※年度単位が希望でしたが、今後読み込み側のプログラム側で年度制御を行なおうと考えているため、今回のSQLは年単位で抽出します。
※取り急ぎ、上記の抽出結果をExcelに貼り付けて別表を作成するために使用したいと思っています(今後はJavaより取得していきます)

[ チェレンジしたところまで ]

SQL

1select 2 client_cd,date_of_use,usage_amount,count_of_use 3from exdb.t_test 4group by client_cd,date_of_use,usage_amount,count_of_use 5order by clinet_cd;

▼▼-----結果-----▼▼
001 2021-01-01 980 1
001 2021-05-01 1980 2
001 2022-04-01 29800 1
002 2021-10-01 4580 2
002 2022-07-01 15800 2
003 2022-08-01 12800 1
▲▲--------------▲▲

たぶん複数のSELECTが混在するのだろうと思っているのですが、
そもそもSQL文のみで実現可能なのか理解できていないところです。勉強不足で大変申し訳ござません。

select
????
from (
select
client_cd,date_of_use,usage_amount,count_of_use
from exdb.t_test
group by client_cd,date_of_use,usage_amount,count_of_use
) as A, ????

アドバイス等いただけますようよろしくお願い致します。

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

PostgreSQL 15.1
pgAdmin4 ver.6.15

※頂きましたアドバイスのSQL確認等は、日中のみしか行えないため、返信が遅くなりますことを予めご承知いただけますと幸いです。

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

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

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

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

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

yuma.inaura

2022/12/20 08:26

テーブル記法が崩れているので直して、コードはコードブロックで囲って読みやすくしておくといかがでしょうか
Orlofsky

2022/12/20 09:45

質問は修正できます。 [ TABLE ] [ INSERT DATA ] は文で [ 実現したいSELECT結果 ] [ チェレンジしたところまで ] ▼▼-----結果-----▼▼ をMarkdownの[コード]を使って提示してください。 https://teratail.com/help/question-tips#questionTips37
guest

回答1

0

以下のようなSQLで実現可能だと思います。年度ごとに集計したい場合はBETWEENに設定する日付を変更してください (例: BETWEEN '2022-04-01' AND '2023-03-31')

SQL

1SELECT 2 client_cd, 3 SUM(CASE WHEN date_of_use BETWEEN '2021-01-01' AND '2021-12-31' THEN count_of_use ELSE 0 END) AS "21年回数", 4 SUM(CASE WHEN date_of_use BETWEEN '2021-01-01' AND '2021-12-31' THEN usage_amount ELSE 0 END) AS "21年金額", 5 SUM(CASE WHEN date_of_use BETWEEN '2022-01-01' AND '2022-12-31' THEN count_of_use ELSE 0 END) AS "22年回数", 6 SUM(CASE WHEN date_of_use BETWEEN '2022-01-01' AND '2022-12-31' THEN usage_amount ELSE 0 END) AS "22年金額" 7FROM t_test 8GROUP BY client_cd 9ORDER BY client_cd

投稿2022/12/23 02:59

neko_the_shadow

総合スコア2395

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問