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

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

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

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

Q&A

解決済

2回答

372閲覧

SQLで1つの列を2つの列に割り振る方法

nabeshidai

総合スコア1

SQL

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

0グッド

0クリップ

投稿2022/08/04 14:31

データベース、初心者です。
似たような問題をうまく見つけることができず、教えていただけると幸いです。

以下のようなテーブルがあります。
このテーブルの点数列を、教科ごとに、国語列と算数列に分けて、テーブルを作りたいです。
テーブルを作るというか、SELECT分と、GROUP BYを使って、できるのかな?というイメージなのですが、どのようにSELECT文を書けば良いでしょうか?
よろしくお願いいたします。

SQL

1SELECT 日付,名前,教科,点数 FROM テーブル名
日付名前教科点数
8/1鈴木算数100
8/2佐藤国語90
8/2鈴木算数95
8/2佐藤算数70
8/3高橋国語85
8/4鈴木算数90
8/4高橋算数100

以下のような出力になるイメージです。

日付名前国語算数
8/1鈴木0100
8/2佐藤9070
8/2鈴木095
8/3高橋850
8/4鈴木900
8/4高橋0100

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

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

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

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

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

daiki002

2022/08/04 15:13

「以下のようなテーブルがあります。」と書かれていますがどのようなテーブルですか?テーブル設計がわかりません。
nabeshidai

2022/08/04 15:41

コメントありがとうございます。 わかりにくくてすみません。一番最初に書いた表(SELECT文の下の表)が、テーブルのイメージでした。
hatena19

2022/08/04 16:29

データベースはなんでしょうか。データベースをタグに追加してください。
KOZ6.0

2022/08/04 16:46

「クロス集計」「SQL」で検索すればサンプルが出てきますよ
nabeshidai

2022/08/05 01:37

データベースは、InfluxDBです。 別途、コメントさせていただきましたが、次回からはもう少し詳細を書こうと思います。 コメント、ありがとうございました。 クロス集計。というキーワードも知らなかったので、参考になりました。ありがとうございました。
guest

回答2

0

汎用的にやるならこんな感じ

SQL

1create table tbl(d date,name varchar(10),subject varchar(10),point int); 2insert into tbl values 3('2022-08-01','鈴木','算数',100), 4('2022-08-02','佐藤','国語',90), 5('2022-08-02','鈴木','算数',95), 6('2022-08-02','佐藤','算数',70), 7('2022-08-03','高橋','国語',85), 8('2022-08-04','鈴木','算数',90), 9('2022-08-04','高橋','算数',100); 10 11 12select d,name 13,sum((case subject when '国語' then 1 else 0 end)*point) as `国語` 14,sum((case subject when '算数' then 1 else 0 end)*point) as `算数` 15from tbl 16group by d,name

ただデータがない教科を0とするのはどうかと思います。
(ほんとに0点だった可能性もあるので)
nullにした方が良いかもしれません
その場合は
sum((case subject when '国語' then 1 end)*point) as 国語
みたいな処理になります

投稿2022/08/05 03:13

yambejp

総合スコア114814

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

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

nabeshidai

2022/08/05 13:02

コメント、ありがとうございます。 ご丁寧に、SQL文まで書いてくださり、ありがとうございました。 これこそ、まさに、私が求めていた回答です。 私の拙い質問を汲み取ってくださり、感謝いたします。 こんなふうに書けるのですね。勉強になりました。 P.S. 実は、InfluxDB には、case 文もないようで、、、これをそのまま使って。ということは残念ながら、出来なさそうで(涙
guest

0

ベストアンサー

投稿2022/08/04 21:05

Orlofsky

総合スコア16415

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

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

nabeshidai

2022/08/05 01:35

ご回答いただきまして、ありがとうございました。 SQLですが、InfluxDBを使っています。基本的なところは、どのDatabaseでも同じか思いまして、抽象的な形での質問になってしまいました。申し訳ございません。 SELECTや、GROUP BYを使えば、できそうな気がしていたのですが、Databaseそれぞれの関数になってしまうようですね。(InfluxDBには、上記のような演算(構文?)が用意されてなく) どういったキーワードで検索すればよいのかも、わからなかったので、挙げていただいた例が、参考になりました。 ありがとうございました。 今回、初めての投稿だったのですが、次回は、もう少し具体的に書きたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問