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

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

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

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

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

解決済

4回答

6690閲覧

group by 列名

kswf

総合スコア1

GROUP BY

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

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

投稿2020/08/13 23:52

編集2020/08/14 00:56
入力テーブル CREATE table INTBL1 ( TENCD CHAR(3) NOT NULL, SHMKCD CHAR(2) NOT NULL, UCWKCD CHAR(4) NOT NULL, STIDATE DATE NOT NULL, RYUCD CHAR(1) NOT NULL, KGK INTEGER , KBN CHAR (1), PRIMARY KEY (TENCD, SHMKCD, UCWKCD, STIDATE, RYUCD, KGK) ); 出力テーブル CREATE table OUTTBL1 ( SHMKCD CHAR(2) NOT NULL, UCWKCD CHAR(4) NOT NULL, STIDATE DATE NOT NULL, RYUCD CHAR(1) NOT NULL, GKIKNS1 INTEGER, GKIKGK1 INTEGER , GKIKNS2 INTEGER, GKIKGK2 INTEGER , KBN CHAR (1), PRIMARY KEY (SHMKCD, UCWKCD,STIDATE) ); 文 SELECT SHMKCD, UCWKCD, STIDATE, RYUCD, CASE WHEN RYUCD = '1' THEN COUNT(STIDATE) ELSE 0 END, CASE WHEN RYUCD = '1' THEN SUM(KGK) ELSE 0 END, CASE WHEN RYUCD = '0' THEN COUNT(STIDATE) ELSE 0 END, CASE WHEN RYUCD = '0' THEN SUM(KGK) ELSE 0 END, CASE WHEN COUNT(KBN = '1') > 0 THEN '1' ELSE '0' END FROM INTBL1 GROUP BY SHMKCD, UCWKCD, STIDATE ; エラー SQL : 列"intbl1.ryucd"はGROUP BY句で出現しなければならないか、集約関数内で使用しなければなりません ```参照元のテーブル 店コード 種目コード 内訳コード 指定日 理由コード 金額 区分  出力先のテーブル 店コード 種目コード 内訳コード 指定日 件数_1 合計金額_1 件数_2 合計金額_2 区分 これを種目コード、内訳コード、指定日でgroup byして件数をカウントし、金額を合計したいです そこは普通に指定日でcountとか金額をsumすればいいと思うのですが、 入れる先のテーブルの列を理由コードによって変えたいんです 理由コードが1なら件数_1と合計金額_1に、それ以外なら件数_2と合計金額_2に入れたいです。 また、集約したレコードの中に区分が1のものが1つでも含まれていたら、入れる先のテーブルの区分を1にしたいんです case when うんたらー then '1' else '0' end とかselect文に書いてたら区分と理由コードはgroup by句で出現しなければならないか、集約関数内で使用しなければなりませんと怒られました。 実際のテーブルは今さわれるところにないので、今てきとうに作りました。間違いがあるかもしれませんがとりあえずはこれでお願いします。 dbはpostgresqlです

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

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

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

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

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

Orlofsky

2020/08/14 00:05

>とかselect文に書いてたら区分と理由コードはgroup by句で出現しなければならないか、集約関数内で使用しなければなりませんと怒られました。 質問にそのSELECT文とエラーメッセージをhttps://teratail.com/help/question-tips#questionTips3-7 の [コード] で追記してください。
Orlofsky

2020/08/14 00:06

[PostgreSQL]タグを追加してください。
guest

回答4

0

ベストアンサー

まず下の日本語で書いてある出力テーブルに理由コードがないのに
上のOUTTBL1テーブルのCREATE文にRYUCDがあるのが乖離があっておかしいです。

そもそも一つのテーブルに理由コード毎にデータを集計するのに
理由コードを一つに絞れるはずがないと思いますが。

実際のOUTTBL1のCREATE文はこうなんではないでしょうか。

SQL

1CREATE table OUTTBL1 2( 3TENCD CHAR(3) NOT NULL, 4SHMKCD CHAR(2) NOT NULL, 5UCWKCD CHAR(4) NOT NULL, 6STIDATE DATE NOT NULL, 7GKIKNS1 INTEGER, 8GKIKGK1 INTEGER , 9GKIKNS2 INTEGER, 10GKIKGK2 INTEGER , 11KBN CHAR (1), 12PRIMARY KEY (TENCD, SHMKCD, UCWKCD,STIDATE) 13);

こういう形式だとしたらSELECT文は

SQL

1SELECT 2 TENCD, 3 SHMKCD, 4 UCWKCD, 5 STIDATE, 6 SUM(CASE WHEN RYUCD = '1' THEN 1 ELSE 0 END), 7 SUM(CASE WHEN RYUCD = '1' THEN KGK ELSE 0 END), 8 SUM(CASE WHEN RYUCD = '0' THEN 1 ELSE 0 END), 9 SUM(CASE WHEN RYUCD = '0' THEN KGK ELSE 0 END), 10 CASE WHEN SUM(CASE WHEN KBN = '1' THEN 1 ELSE 0 END) > 0 THEN '1' ELSE '0' END 11FROM INTBL1 12GROUP BY TENCD, SHMKCD, UCWKCD, STIDATE;

これでいけると思います。

投稿2020/08/14 02:00

編集2020/08/14 02:04
yureighost

総合スコア2183

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

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

kswf

2020/08/14 03:03

ありがとうございます おっしゃるとおりouttbl1の理由コードは余計でした
guest

0

データサンプルが無いので求める形かどうか分かりませんが、エラーにならない記述なら以下

SQL

1SELECT SHMKCD, UCWKCD, STIDATE 2 , SUM(CASE WHEN RYUCD = '1' THEN 1 ELSE 0 END) 3 , SUM(CASE WHEN RYUCD = '1' THEN KGK ELSE 0 END) 4 , SUM(CASE WHEN RYUCD = '0' THEN 1 ELSE 0 END) 5 , SUM(CASE WHEN RYUCD = '0' THEN KGK ELSE 0 END) 6 , CASE WHEN SUM(case when KBN = '1' then 1 else 0 end) > 0 THEN '1' ELSE '0' END 7FROM INTBL1 8GROUP BY SHMKCD, UCWKCD, STIDATE

投稿2020/08/14 01:53

sazi

総合スコア25195

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

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

kswf

2020/08/14 13:58

ありがとうございます
guest

0

SQL : 列"intbl1.ryucd"はGROUP BY句で出現しなければならないか、集約関数内で使用しなければなりません

RYUCD をGROUP BY 句に追加してください。

投稿2020/08/14 01:20

Orlofsky

総合スコア16415

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

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

kswf

2020/08/14 01:31

GROUP BY に項目を加えることもかんがえたのですが、理由コードや区分の数だけレコード数が増えちゃいませんか? やりたい形にするには、一発でやろうとせずに中間的なテーブルを追加して何回かに分けて編集しないといけないんですかね、
Orlofsky

2020/08/14 01:39

SQLは実際に実行して確認します。 GROUP BY を4列で実行できましたか? インラインビューでGROUP BY を4列で、その外でGROUP BY を3列で試しては?
guest

0

テーブルの構造だけで、実データを見ていないので雰囲気がつかめていませんが、
「種目コード、内訳コード、指定日でgroup by」した場合に、
理由コードが複数出現する可能性があるから、
group by句に加えないといけないっていうことなんじゃないかな。

「種目コード、内訳コード、指定日で」絞り込んだ場合に、
複数行存在して理由コードが複数出現するなら、
「種目コード、内訳コード、指定日でgroup by」する場合には、
理由コードも加えて集約しないと行けないんじゃないかなぁ。

考えを巡らすためにも、
質問文中にサンプルデータみたいなものは示せますか?

投稿2020/08/14 01:13

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問