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

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

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

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

Q&A

解決済

2回答

693閲覧

SQL データベースで重複箇所を消す方法

essa

総合スコア81

SQL

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

0グッド

2クリップ

投稿2019/02/07 05:31

編集2019/02/08 04:46

標記について質問させてください。

データベースで、下記のような方法で縦に長い表から縦に長い表に変えました。
参考サイト

しかし、表が重複しており、かなり長い縦に長い表になってしまいました。

現在の形と、出力させたい形のイメージ図を添付します。

イメージ説明
どなたか方法をご存知でしたら、教えていただければと思います。

どうぞよろしくお願い致します。

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

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

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

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

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

m.ts10806

2019/02/07 05:43

お使いのデータベースの種類と今回のテーブルのCREATE TABLE文、サンプルデータのINSERT文をご提示ください。画像からデータにおこすのはさすがに手がかかりますので。
essa

2019/02/08 04:35

Orlofsky様 コメントありがとうございます。 マークダウンのリンク機能は知りませんでした。 今後はリンク機能を使います。 mts10806様 コメントありがとうございます。 今回はもともと存在しているデータベースを触っていました。したがって、create tableやinsertといった操作をしたことがなく。。。 今回は解決したのでいいのですが、今後データベースについて質問する際はcreate tableやinsert文を提示した上で、質問させていただきます。 ご指摘ありがとうございました。
Orlofsky

2019/02/08 04:44

ここの掲示板は質問も回答も修正する機能が付いています。今から直しても遅くはありません。
essa

2019/02/08 04:46

できました! ありがとうございます!
m.ts10806

2019/02/08 04:49

どのDBを使ってるかわかりませんが、大抵はGUIツールなどにエクスポート機能がついてるのでそれを使うか、直接コマンドでdumpするのもありだと思います。
guest

回答2

0

普通にピボット処理でしょうね

SQL

1create table tbl(id int primary key auto_increment,user varchar(10),year int,val int,unique key(user,year)); 2 3insert into tbl(user,year,val) values 4('AAA',2000,3), 5('BBB',2000,54), 6('CCC',2000,5), 7('AAA',2001,7), 8('BBB',2001,4), 9('CCC',2001,86), 10('AAA',2002,65), 11('BBB',2002,42), 12('CCC',2002,31), 13('AAA',2003,56), 14('BBB',2003,4), 15('CCC',2003,21);

これを命題の形式にしているのはこう

PHP

1select user 2,case year when 2000 then 1 else 0 end * val as x2000 3,case year when 2001 then 1 else 0 end * val as x2001 4,case year when 2002 then 1 else 0 end * val as x2002 5,case year when 2003 then 1 else 0 end * val as x2003 6from tbl

希望しているのは単に集計

PHP

1select user 2,sum(case year when 2000 then 1 else 0 end * val) as x2000 3,sum(case year when 2001 then 1 else 0 end * val) as x2001 4,sum(case year when 2002 then 1 else 0 end * val) as x2002 5,sum(case year when 2003 then 1 else 0 end * val) as x2003 6from tbl 7group by user

蛇足

これをmysqlでやるときprocedureでこう作っておきます

SQL

1drop procedure if exists shukei; 2delimiter // 3create procedure shukei(IN start_year int,IN end_year int) 4begin 5declare year int default 0; 6set year=start_year; 7set @sql='select user'; 8while year<=end_year do 9set @sql=concat(@sql,',sum((year=',year,')*val) as x',year); 10set year=year+1; 11end while; 12set @sql=concat(@sql,' from tbl group by user'); 13prepare stmt from @sql; 14execute stmt; 15end 16// 17delimiter ;

集計の呼び出し

SQL

1call shukei(2000,2003);

結果:

userx2000x2001x2002x2003
AAA376556
BBB544424
CCC5863121

投稿2019/02/07 10:18

編集2019/02/07 10:36
yambejp

総合スコア114829

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

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

essa

2019/02/08 04:36

かなり詳細な回答ありがとうございます。 参考にさせていただきます!
guest

0

ベストアンサー

リンク先(SQL で縦横変換まとめ(pivot と unpivot))から、Treasure Dataだと推測します。

その集計のSQLのgroup by項目を減らせば良いだけだと思いますけど。
情報提供して貰えないと、これ以上詳細には回答は出来ません。

投稿2019/02/07 05:52

sazi

総合スコア25188

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

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

essa

2019/02/08 04:37

回答ありがとうございます。 確かに、group by項目を減らしたところこちらの想定していた処理結果となりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問