sqlserver 查詢各個學生語文、數學、英語、歷史課程成績


 

 

-- 建表 插入數據
USE 你自己的數據庫;

CREATE TABLE Member(
    MID Char(10) PRIMARY KEY,
    MName Char(50)
);

CREATE TABLE Course(
    FID Char(10) PRIMARY KEY,
    FName Char(50)
);

CREATE TABLE Score1(
    SID INT PRIMARY KEY,
    FID Char(10) FOREIGN KEY REFERENCES Course(FID),
    MID Char(10)  FOREIGN KEY REFERENCES Member(MID),
    Scores INT
);

INSERT INTO Member VALUES
(
    '1', '張三'
),
(
    '2', '李四'
),
(
    '3', '王強'
),
(
    '4', '張珊'
)

INSERT INTO Course VALUES
(
    '11', '語文'
),
(
    '22', '數學'
),
(
    '33', '英語'
),
(
    '44', '歷史'
)

INSERT INTO Score1 VALUES
(
    101, '11', '1', 99
),
(
    102, '22', '1', 70
),
(
    103, '33', '1', 60
),
(
    104, '44', '1', 80
),
(
    201, '11', '2', 66
),
(
    202, '22', '2', 76
),
(
    203, '33', '2', 97
),
(
    204, '44', '2', 84
),
(
    301, '11', '3', 23
),
(
    302, '22', '3', 43
),
(
    303, '33', '3', 65
),
(
    304, '44', '3', 86
),
(
    401, '11', '4', 54
),
(
    402, '22', '4', 87
),
(
    403, '33', '4', 90
),
(
    404, '44', '4', 31
)
-- 查詢各個學生語文、數學、英語、歷史課程成績
-------------------------------------------
-- SELECT m.*, s.Scores FROM Member m
-- INNER JOIN Score s ON m.MID = s.MID
-- INNER JOIN Course c ON s.FID = c.FID
-- WHERE c.FID = (SELECT FID FROM Course
-- WHERE FName = '語文')
-- 先聯表查出語文的成績及相關內容
-- 在copy其他修改
--------------------------------------------
SELECT mb.MName AS 姓名, tempChinese.Scores AS 語文, tempMath.Scores AS 數學, 
tempEnlish.Scores AS 英語, tempLong.Scores AS 歷史
FROM Member mb
LEFT JOIN
(SELECT m.*, s.Scores FROM Member m
INNER JOIN Score s ON m.MID = s.MID
INNER JOIN Course c ON s.FID = c.FID
WHERE c.FID = (SELECT FID FROM Course
WHERE FName = '語文')) tempChinese
ON mb.MID = tempChinese.MID
LEFT JOIN 
(SELECT m.*, s.Scores FROM Member m
INNER JOIN Score s ON m.MID = s.MID
INNER JOIN Course c ON s.FID = c.FID
WHERE c.FID = (SELECT FID FROM Course
WHERE FName = '數學')) tempMath
ON tempMath.MID = tempChinese.MID
LEFT JOIN 
(SELECT m.*, s.Scores FROM Member m
INNER JOIN Score s ON m.MID = s.MID
INNER JOIN Course c ON s.FID = c.FID
WHERE c.FID = (SELECT FID FROM Course
WHERE FName = '英語')) tempEnlish
ON mb.MID = tempEnlish.MID
LEFT JOIN 
(SELECT m.*, s.Scores FROM Member m
INNER JOIN Score s ON m.MID = s.MID
INNER JOIN Course c ON s.FID = c.FID
WHERE c.FID = (SELECT FID FROM Course
WHERE FName = '歷史')) tempLong
ON mb.MID = tempLong.MID

-- 雖然多個子表連起來 也可以使用 但是太繁瑣了
-- 通過姓名分組 max找最大值 利用case 就可以很方便了
SELECT m.MName as 姓名,
max(case c.FName when '語文' then s.Scores else 0 end) as 語文,
max(case c.FName when '數學' then s.Scores else 0 end) as 數學,
max(case c.FName when '英語' then s.Scores else 0 end) as 英語,
max(case c.FName when '歷史' then s.Scores else 0 end) as 歷史
From Score1 as s
INNER JOIN Member m ON m.MID=s.MID
inner join Course as c on c.FID=s.FID
GROUP BY m.MName

 

-- 利用存儲過程 分數小於70
create PROCEDURE #scoreinit
@score int
AS
SELECT m.MName as 姓名,
max(case c.FName when '語文' then s.Scores else 0 end) as 語文,
max(case c.FName when '數學' then s.Scores else 0 end) as 數學,
max(case c.FName when '英語' then s.Scores else 0 end) as 英語,
max(case c.FName when '歷史' then s.Scores else 0 end) as 歷史
From Score1 as s
INNER JOIN Member m ON m.MID=s.MID
inner join Course as c on c.FID=s.FID
WHERE s.Scores < @score
GROUP BY m.MName
-- drop PROCEDURE #scoreinit

EXEC #scoreinit @score=70

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM