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

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

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

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

Q&A

解決済

3回答

1746閲覧

SQLで文字列の連結をしたい

J1N

総合スコア56

SQL

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

1グッド

1クリップ

投稿2019/06/19 08:02

編集2019/06/19 08:05

GROUP BYによるデータの圧縮をしたい

やりたいことは下記のようなデータの圧縮です。

日付伝票番号オーダー金額
3/11111牛丼380
3/11111豚汁100
3/11112カレー700
3/11112コーヒー200
3/21211つけ麺400
3/21211味たま50
3/31311ピザ1000
3/31311ポテト300

⬇︎

日付伝票番号オーダー金額
3/11111牛丼 , 豚汁480
3/11112カレー , コーヒー900
3/21211つけ麺 , 味たま450
3/31311ピザ , ポテト1300

該当のソースコード

SELECT '日付','伝票番号','オーダー',SUM('金額') FROM table GROUP BY '日付','伝票番号'

発生している問題

「オーダー」がなければ、上記の書き方ではうまく行くと思いますが、文字列が入ってくると機能しなくなるかと思います。
上記のような圧縮をするにはどのようにしたらよろしいでしょうか?

ネットで調べたのですが、うまく実行できるコードが見つかりませんでした。

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

AWSの環境でPythonを通してSQLの操作をしています。

DrqYuto👍を押しています

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

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

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

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

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

yambejp

2019/06/19 08:11

AWSの環境でPythonを通して操作するSQLって なにか所定のSQLなのでしょうか? 文字列の連結はSQLによってさまざまなので・・・
mather

2019/06/19 08:17

DBは何互換でしょうか? PostgreSQL互換とかMySQL互換とか…。
mather

2019/06/19 08:21

蛇足ですが「データの圧縮」という言い方はあまり良くないです。行数は減りますが、情報量としては減ってしまいます。(金額が合計値になるので元のデータに戻せない) 一般的にこのような複数行を一つの結果にまとめる処理を「集約(aggregation)」といいます。
Orlofsky

2019/06/19 08:34

SQLでは '文字列' とシングルクォートで囲むと文字列として扱われます。 '日付', '伝票番号', 'オーダー', '金額' はみな文字列です。
J1N

2019/06/19 08:41

アドバイスをいただき、ありがとうございます。 言葉遣いにつきまして、大変勉強になりました。 DBが何互換かについてなんですが、実は把握できておりません。 先ほどMySQLのコードを試してダメだったので、それ以外かと思います。 もし、DBの環境を調べられる方法がありましたらぜひ教えていただけますと幸いです。
guest

回答3

0

ベストアンサー

PostgreSQLならこんな感じ(テーブル定義をyambejpさんのをパクらせていただきました)

SQL

1create table tbl(日付 date,伝票番号 int,オーダー varchar(20),金額 int); 2insert into tbl values 3('2019-03-01',1111,'牛丼',380), 4('2019-03-01',1111,'豚汁',100), 5('2019-03-01',1112,'カレー',700), 6('2019-03-01',1112,'コーヒー',200), 7('2019-03-02',1211,'つけ麺',400), 8('2019-03-02',1211,'味たま',50), 9('2019-03-03',1311,'ピザ',1000), 10('2019-03-03',1311,'ポテト',300); 11 12 13select to_char(日付, 'MM/DD') as 日付,伝票番号,array_to_string(ARRAY(SELECT unnest(array_agg(オーダー))), ',') as オーダー,sum(金額) as 金額 14from tbl 15group by 日付,伝票番号;

投稿2019/06/19 08:50

kasa0

総合スコア578

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

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

J1N

2019/06/19 08:54

ご回答いただき、ありがとうございます。 試してみたらうまくいきました。 どうやらPostgreSQLだったようです。 大変助かりました。 ありがとうございます。
sazi

2019/06/19 15:11 編集

> array_to_string(ARRAY(SELECT unnest(array_agg(オーダー))), ',') as オーダー は、 array_to_string(array_agg(オーダー), ',') as オーダー だけで良くないですか?
guest

0

たとえばMySQLならこんな感じ

SQL

1create table tbl(日付 date,伝票番号 int,オーダー varchar(20),金額 int); 2insert into tbl values 3('2019-03-01',1111,'牛丼',380), 4('2019-03-01',1111,'豚汁',100), 5('2019-03-01',1112,'カレー',700), 6('2019-03-01',1112,'コーヒー',200), 7('2019-03-02',1211,'つけ麺',400), 8('2019-03-02',1211,'味たま',50), 9('2019-03-03',1311,'ピザ',1000), 10('2019-03-03',1311,'ポテト',300); 11 12 13select 日付,伝票番号,group_concat(オーダー) as オーダー,sum(金額) as 金額 14from tbl 15group by 日付,伝票番号;

投稿2019/06/19 08:23

yambejp

総合スコア114843

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

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

J1N

2019/06/19 08:39

ご回答いただき、ありがとうございます。 早速試してみたのですが、エラーが起きてしまいました。 全くの初心者で、なんのSQLかも把握できていないまま質問をしてしまいましたが、GROUP_CONCATが使えないのでMySQLではないのだろうと思います。 SQLの環境を調べるための方法は何かありますでしょうか?
J1N

2019/06/19 08:56

早々にご回答いただき、ありがとうございました。 何もわからなかったところから、yambejpさんに回答をいただけたことで、MySQLじゃないことがわかり、選択肢が絞られ、大変助かりました。 ありがとうございます。
guest

0

SQLでの文字列連結 をお試しください。

投稿2019/06/19 09:58

Orlofsky

総合スコア16415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問