我有一張這樣的桌子:
| 身份證(PK) | 姓名 | 課程 | 日期 | 年級 |
|---|---|---|---|---|
| 1 | 簡 | 法語 | 2016-11-20 | 20 |
| 3 | 卡爾 | 法語 | 2015-09-02 | 30 |
| 4 | 安娜 | 法語 | 2016-11-20 | 25 |
| 5 | 喬恩 | 法語 | 2016-09-02 | 56 |
| 6 | 琳達 | 英語 | 2016-09-02 | 22 |
| 7 | 蒂姆 | 英語 | 2016-11-20 | 23 |
| 8 | 喬恩 | 英語 | 2016-11-20 | 44 |
我想知道是否可以用一個查詢來回答以下兩個問題:
按課程分組時,每個課程所有日期的所有注冊學生的平均成績是多少?(這似乎更簡單,粗略地分組幾列,然后取“等級”列的平均值)。
按日期注冊每門課程的平均學生人數是多少?換個說法,“在‘英語’中,由于 11-20 有兩名學生入學,09-02 有一名學生入學,因此每個班級日期的平均入學人數為 1.5。
是否可以通過一個查詢來回答這兩個問題?或者,是不是因為我將“按”不同的列進行“分組”,所以我無法在單個查詢中實作這一點?
我正在使用由 SQL Server 資料庫支持的 EF Core 5.0,因此如果我可以使用 LINQ groupby 運算子來實作這一點,那將是很巧妙的,但如果沒有,我不介意直接撰寫 SQL,如果它更有效的話。
uj5u.com熱心網友回復:
將這些結合起來會有些困難,而且在 EF/Linq 中幾乎不可能做到。我會說只有在查詢表兩次效率非常低的情況下才值得。否則,只需在 EF 中或作為兩個查詢的單個 T-SQL 批處理來執行它們。
- 第一個查詢可以很容易地在 T-SQL 中回答
SELECT
c.Course,
AVG(c.Grade * 1.0) AvgGrade
FROM Course c
GROUP BY
c.Course;
在 Linq
from c in Course
group by c.Course into g
select new {
Course: g.Key,
AvgGrade: g.Avg(c2 => c2.Grade * 1.0)
}
- 同樣,另一個查詢
SELECT
c.Course,
AVG(Count * 1.0) AvgCount
FROM (
SELECT
c.Course,
COUNT(*) Count
FROM Course c
GROUP BY
c.Course,
c.Date
) c
GROUP BY
c.Course;
在 Linq
from c in Course
group by new {c.Course, c.Date} into g
select new {
Course: g.Key.Course,
Count: g.Count()
} into c2
group by c2.Course into g2
select new {
Course: g2.Key,
AvgCount: g2.Average(c3 => c3.Count * 1.0)
}
要結合這一點,您可以使用以下內容:
由于已經存在聚合,并且您不能(在數學上)對平均值進行平均,這使情況變得更加復雜。所以你需要使用SUM / COUNT和嵌套分組。
SELECT
c.Course,
AVG(Count * 1.0) AvgCount,
SUM(c.TotalGrades) * 1.0 / SUM(Count) AvgGrade
FROM (
SELECT
c.Course,
COUNT(*) Count,
SUM(c.Grade) TotalGrades
FROM Course c
GROUP BY
c.Course,
c.Date
) c
GROUP BY
c.Course;
在 Linq
from c in Course
group by new {c.Course, c.Date} into g
select new {
Course: g.Key.Course,
Count: g.Count(),
TotalGrades: g.Sum(c3 => c3.Grade)
} into c2
group by c2.Course into g2
select new {
Course: g2.Key,
AvgCount: g2.Average(c3 => c3.Count * 1.0).
AvgGrade: g2.Sum(c3 => c3.TotalGrades) * 1.0 / g2.Sum(c3 => c3.Count)
}
db<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/476603.html
