我有 3 個 MySQL (MariaDB) 表:
學生:
| 學生卡 | 姓名 | result_id |
|---|---|---|
| 1 | 八對 | 31 |
| 2 | 多摩 | 32 |
| 3 | 龍本 | 33 |
主題:
| 主題ID | 積分 | result_id |
|---|---|---|
| 1 | 90 | 31 |
| 2 | 90 | 31 |
| 3 | 90 | 31 |
| 1 | 84 | 32 |
| 2 | 85 | 32 |
| 3 | 86 | 32 |
| 1 | 87 | 33 |
| 2 | 89 | 33 |
| 3 | 88 | 33 |
平均分:
| AS_id | 平均分 | result_id |
|---|---|---|
| 1 | 90 | 31 |
| 2 | 85 | 32 |
| 3 | 88 | 33 |
所需表:
| 姓名 | 1 | 2 | 3 | 平均分 |
|---|---|---|---|---|
| 八對 | 90 | 90 | 90 | 90 |
| 龍本 | 87 | 89 | 88 | 88 |
| 多摩 | 84 | 85 | 86 | 85 |
我需要通過使用 join 和 pivot 來獲得這個視圖,但我不知道將 join 和 pivot 完全結合起來。這是我的JOIN sql
SELECT
name, subject_id, points, average_score
FROM
Students as stud
JOIN
Average_Score as avr
ON
stud.result_id = avr.result_id
JOIN
Subject as subj
ON
avr.result_id = subj.result_id
ORDER BY name
這是 JOIN sql 的結果
| 姓名 | 主題ID | 積分 | 平均分 |
|---|---|---|---|
| 八對 | 1 | 90 | 90 |
| 八對 | 2 | 90 | 90 |
| 八對 | 3 | 90 | 90 |
| 龍本 | 1 | 87 | 88 |
| 龍本 | 2 | 89 | 88 |
| 龍本 | 3 | 88 | 88 |
| 多摩 | 1 | 84 | 85 |
| 多摩 | 2 | 85 | 85 |
| 多摩 | 3 | 86 | 85 |
是否有任何有效的方法來修改我的 sql 以匹配資料透視表以獲得所需的視圖?
我需要一些幫助才能獲得正確的查詢,請。謝謝你。
uj5u.com熱心網友回復:
您可以嘗試使用以下查詢:
SELECT stud.name,
MAX(IF(subj.subject_id=1, subj.points, NULL)) AS `1`,
MAX(IF(subj.subject_id=2, subj.points, NULL)) AS `2`,
MAX(IF(subj.subject_id=3, subj.points, NULL)) AS `3`,
ROUND(AVG(subj.points)) AS `average_score`
FROM Students stud
INNER JOIN Subject subj
ON stud.result_id = subj.result_id
GROUP BY stud.name
這個解決方案背后的想法是在欄位上加入表Student和Subject ,然后為每個對應result_id的列獲取一個列,并使用 MAX 函式聚合以洗掉 NULL 值。最終,您可以直接根據Subject表中的資料進行計算,而不是加入Average_Points表。pointssubject_id
在這里試試。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/485851.html
