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

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

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

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

Q&A

解決済

2回答

315閲覧

SQLを使用して、テーブルのカラムを合計して縦列を入れ替えて取得したい。

itouuuuuuuuu

総合スコア14

SQL

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

0グッド

0クリップ

投稿2022/01/21 12:09

編集2022/01/21 12:17

質問させていただきます。

DB上に、下記のようなsample_tableテーブルがあると想定します。

typecost
A10
A100
A200
B50
B10
C10
C20
C30
C40

このテーブルに対して、下記のような形で結果を取得できるSQL文を作成したいのですが、うまく行かずに詰まっています。

ABCD
310601000

type毎にカラムが分けられ、costの合計が値になります。
カラム名の A B C D は固定(クエリ内に直接指定しても良い)の想定です。
もとの sample_table には Dというtypeがないため、そのcostの合計は0となります。

イメージとしては、下記クエリの結果の行と列を入れ替えて、かつ D という元のテーブルにないtypeの total_cost は0になるというものです。

sql

1SELECT 2 type, 3 SUM(cost) AS total_cost 4FROM sample_table 5GROUP BY type

アドバイスいただければ幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

DBMSが不明なので確実なことは言えないのですが、たとえば以下のようなクエリであれば、多くのDBMSで希望の結果を得ることができると思います。

sql

1SELECT 2 COALESCE(SUM(CASE WHEN type = 'A' THEN cost END), 0) AS A, 3 COALESCE(SUM(CASE WHEN type = 'B' THEN cost END), 0) AS B, 4 COALESCE(SUM(CASE WHEN type = 'C' THEN cost END), 0) AS C, 5 COALESCE(SUM(CASE WHEN type = 'D' THEN cost END), 0) AS D 6FROM sample_table

SQL ServerやOracleのようにPIVOTがサポートされているDBMSであれば以下のようなクエリでも実現できると思います。

sql

1SELECT 2 COALESCE(A, 0) AS A, 3 COALESCE(B, 0) AS B, 4 COALESCE(C, 0) AS C, 5 COALESCE(D, 0) AS D 6FROM sample_table 7PIVOT (SUM(cost) FOR type IN (A, B, C, D)) AS T;

投稿2022/01/21 13:11

neko_the_shadow

総合スコア2230

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

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

takanaweb5

2022/01/22 01:04

COALESCEを使用しなくても CASE文でelse 0 とすれば、nullを0に出来ると思います。 SELECT SUM(CASE WHEN type = 'A' THEN cost ELSE 0 END) AS A, SUM(CASE WHEN type = 'B' THEN cost ELSE 0 END) AS B, SUM(CASE WHEN type = 'C' THEN cost ELSE 0 END) AS C, SUM(CASE WHEN type = 'D' THEN cost ELSE 0 END) AS D FROM sample_table
itouuuuuuuuu

2022/01/22 08:14

ご指摘の方法で動作させることができました。 大変参考になりました。 ありがとうございます!
guest

0

SELECTの前に

SQL

1SELECT 'D' AS TYPE 2 , 0 AS COST 3FROM DUAL 4UNION ALL

を追加しては?
(Oracle Database での記述方法、同じSQLでもデータベースやバージョンによって方言が大きいのでデータベースやバージョン)は明記できた方適切なコメント付きやすいです。

投稿2022/01/21 12:34

Orlofsky

総合スコア16415

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

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

itouuuuuuuuu

2022/01/22 08:12

なるほど、UNIONで追加するという方法もありそうですね! アドバイスありがとうございます。 参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問