Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

[データベース]フィールドの内容を列として表示したい

従業員表

従業員ID 苗字 名前 年齢
1001 田中 一郎 31
1002 山田 花子 28

メニュー表

メニューID メニュー名 料金
101 電気治療 5,000
102 全身 4,500
103 足つぼ 1,500
104 頭皮マッサージ 2,000

上記の表二つからうまくデータを抽出して
下のように表示させたいのですが
どのようなSQL文を書けばいいでしょうか?

担当表

担当者 電気治療 全身 足つぼ 頭皮マッサージ
1001
1002
0

2Answer

従業員がどのメニューを実施できるか管理されたテーブルが無いため、担当表の作成は不可能

1Like

Comments

  1. ではどうすればよいかと言えば、従業員とメニューを結びつける表を用意すれば可能

    例えば

    従業員 | メニュー
    -------+----------
    1001 | 3
    1002 | 2
    1002 | 4
    -------+----------

    な感じ

取り敢えず、こんな感じでいかがでしょうか。
検証にSQLiteを使ったので、MySQLで動かないところがあったらごめんなさい。

コード
--DROP TABLE IF EXISTS "従業員表";
CREATE TABLE IF NOT EXISTS "従業員表" ("従業員ID", "苗字", "名前", "年齢");
INSERT INTO "従業員表" VALUES 
	(1001, '田中', '一郎', 31),
	(1002, '山田', '花子', 28)
;

--DROP TABLE IF EXISTS "メニュー表";
CREATE TABLE IF NOT EXISTS "メニュー表" ("メニューID", "メニュー名", "料金");
INSERT INTO "メニュー表" VALUES 
	(101, '電気治療', 5000),
	(102, '全身', 4500),
	(103, '足つぼ', 1500),
	(104, '頭皮マッサージ', 2000)
;

--DROP TABLE IF EXISTS "担当表";
CREATE TABLE IF NOT EXISTS "担当表" ("従業員ID", "メニューID");
INSERT INTO "担当表" VALUES 
	(1001, 101),
	(1001, 102),
	(1001, 103),
	(1001, 104),
	(1002, 102),
	(1002, 104)
;

SELECT
	"苗字"||"名前" AS "施術者", 
	group_concat("メニュー名") AS "メニュー"
FROM "従業員表" NATURAL INNER JOIN "担当表" NATURAL INNER JOIN "メニュー表"
GROUP BY "従業員ID";

結果
施術者 メニュー
田中一郎 電気治療,全身,足つぼ,頭皮マッサージ
山田花子 全身,頭皮マッサージ

ご質問のようにSQLだけでレコード内のデータをカラム名として出力するためには、動的SQLが必要になるのだろうと思うのですが、SQLiteを囓った程度の浅学で、詳しくは存じません。
参考: MySQLの動的SQL使って検索するカラム名を動的に指定する

1Like

Comments

  1. @nameraka0903

    Questioner

    大大大感謝です!!!!
    動的SQLというワードも初めて知ることができました。
    カラム名として出力はプログラム側の処理にすることにしました。丁寧な回答ありがとうございました😭

Your answer might help someone💌