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

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

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

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

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

Q&A

解決済

1回答

732閲覧

SQLiteのSELECTの仕方

poop

総合スコア11

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

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

0グッド

0クリップ

投稿2021/12/10 20:48

前提・実現したいこと

SQLliteについて次のtableより

| id | 担当 | 時期 |
| ---- | ---- | ---- |
| 1 | hoge | 前期 |
| 2 | hoge | 後期|
| 3 | foo | 前期|
| 4 | foo | 前期|
| 5 | bar | 前期|
| 6 | bar | 後期|
| 7 | bar | 後期|

次のように取得したいです

| 担当 | 前期 | 後期 |
| ---- | ---- |
| hoge | 1  | 1 |
| foo | 1  | 0
| bar| 1| 1|

または
| 担当 | 前期 | 後期 |
| ---- | ---- |
| hoge | 1  | 1 |
| foo | 2  | 0
| bar| 1 | 2 |

該当のソースコード

作成したテーブルです

SQLite

1CREATE TABLE mytable ( 2 id INTEGER PRIMARY KEY, 3 担当 TEXT NOT NULL, 4 時期 TEXT NOT NULL 5); 6 7INSERT INTO mytable (担当, 時期) VALUES ('hoge','前期'); 8INSERT INTO mytable (担当, 時期) VALUES ('hoge','後期'); 9INSERT INTO mytable (担当, 時期) VALUES ('foo', '前期'); 10INSERT INTO mytable (担当, 時期) VALUES ('foo', '前期'); 11INSERT INTO mytable (担当, 時期) VALUES ('bar', '前期'); 12INSERT INTO mytable (担当, 時期) VALUES ('bar', '後期'); 13INSERT INTO mytable (担当, 時期) VALUES ('bar', '後期');

試したこと

次のように試しましたが SUM('前期'),SUM('後期') が共に0でした

実行文

SQLite

1SELECT 担当 , 時期 , 2CASE 3 WHEN 時期 = '前期' THEN 1 4 ELSE 0 5END AS '前期', 6CASE 7 WHEN 時期 = '後期' THEN 1 8 ELSE 0 9END AS '後期', 10SUM('前期'), 11SUM('後期') 12FROM mytable 13GROUP BY 担当, 時期;

結果

|担当|時期|前期|後期|SUM('前期')|SUM('後期')
| ---- | ---- | ---- | ---- |
bar|前期|1|0|0.0|0.0
bar|後期|0|1|0.0|0.0
foo|前期|1|0|0.0|0.0
hoge|前期|1|0|0.0|0.0
hoge|後期|0|1|0.0|0.0

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんな感じで如何でしょうか?

SQL

1SELECT 2 担当, 3 SUM(前期) AS '前期', 4 SUM(後期) AS '後期' 5FROM 6( 7 SELECT 8 担当, 9 CASE WHEN 時期 = '前期' THEN 1 ELSE 0 END AS '前期', 10 CASE WHEN 時期 = '後期' THEN 1 ELSE 0 END AS '後期' 11 FROM mytable 12) AS T 13GROUP BY 担当;

投稿2021/12/10 21:39

cx20

総合スコア4648

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

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

poop

2021/12/10 21:47

ありがとうございます! 解決できました!
takanaweb5

2021/12/10 23:28

サブクエリを使わなくても SUM(CASE WHEN 時期 = '前期' THEN 1 ELSE 0 END) AS 前期 または TRUEは1,FALSEは0と等価なので SUM(時期 = '前期') AS 前期 とできますよ。
cx20

2021/12/11 10:10

takanaweb5 さん、情報ありがとうございます。 そのようなやり方もあるのですね。勉強になります。 ちなみに、MySQL / SQLite では両方とも動きましたが、SQL Server だと SUM(時期 = '前期') は構文エラーで使えないようでした。参考情報まで。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問