Fina_Must表:学生通知单表
字段:
ID,StuTuitionID(学号),Grade(年级),SpeciltyID(专业代码),Year(学年) ,Term(学期)
1 1 03 11
2 1 03 12 改专业了 06-07 1
3 2 04 11 06-07 1
4 3 05 21
学生有可能改专业,所以他可能出现两个通知单。Fina_Student表:学生表
字段:
StuTuiTionID(学号),nj(年级),zydm(专业代码),
1 03 12
2 04 11
3 05 21现在我想按照 年级/专业 分组 通知单,
然后的得到每个 年级/专业 的通知单总数,
注意(如果有的学生在这个学年学期有两张通知单——改专业了,只能取一张通知单数,而且取的是这个学生最近的通知单;如果这个 年级/专业 还没有通知单页要显示这个 年级/专业 的通知单数 为零)
应该怎么写啊?
谢谢,大家!
字段:
ID,StuTuitionID(学号),Grade(年级),SpeciltyID(专业代码),Year(学年) ,Term(学期)
1 1 03 11
2 1 03 12 改专业了 06-07 1
3 2 04 11 06-07 1
4 3 05 21
学生有可能改专业,所以他可能出现两个通知单。Fina_Student表:学生表
字段:
StuTuiTionID(学号),nj(年级),zydm(专业代码),
1 03 12
2 04 11
3 05 21现在我想按照 年级/专业 分组 通知单,
然后的得到每个 年级/专业 的通知单总数,
注意(如果有的学生在这个学年学期有两张通知单——改专业了,只能取一张通知单数,而且取的是这个学生最近的通知单;如果这个 年级/专业 还没有通知单页要显示这个 年级/专业 的通知单数 为零)
应该怎么写啊?
谢谢,大家!
一是如果是改专业了,那么如何得到他真正所在的专业呢?更加专业的最新的修改日期?
第二:对于年级和专业是不是有单独的表,这个问题主要是针对没有通知单的年级和专业来说的。
如果有单独的表 例如 Grade 表和Specilty表(id,name)估计应该好办点。
分组学生 年级,专业
直接 在学生表(Fina_Student)里获取获得的结果类似下面:
年级 专业 收费通知单总数
03 11 1
04 12 1
05 21 1
因此直接获取学生的 在收费单表(Fina_Must)里去最新的行了。年级和专业 我是针对学生来的,即在校学生有这个年级/专业 我才留下。
谢谢你!
没有的情况下 这个 年级/专业 的 通知单数 为 0
SELECT Max(ID) FROM 学生通知单表 group by 学号,年级Step2: 在Step1的基础上,获得每个学生最后一张通知单
SELECT * FROM 学生通知单表 WHERE ID IN (Step1的语句)Step3: 在Step2的基础上,整理出所有某年有通知单的专业的通知单数量
Select 专业代码,年级,Count(*) AS 数量 FROM (Step2的语句) GROUP BY 专业代码,年级
或者可以简写为
SELECT 专业代码,年级,Count(*) AS 数量 FROM 学生通知单表 WHERE ID IN (Step1的语句) GROUP BY 专业代码,年级==========================================================
如果LZ希望对没有出现通知单的专业/年级 要显示出0的话,那么
首先得知道一共有哪些专业,姑且用“专业表”来表示所有专业的信息。
然后得知道一共查哪几个年级。例如我们现在查的是11,12,13几个年级Step4: 整理出各个专业所有年级的列表,例如
(
SELECT 11 AS 年级, 专业号 FROM 专业表
UNION
SELECT 12 AS 年级, 专业号 FROM 专业表
UNION
SELECT 13 AS 年级, 专业号 FROM 专业表
)Step5: 利用子查询查出所有专业各个年级的编号单数量
SSELECT a.专业, a.年级,
(SELECT Count(*) FROM (Step2的语句) b WHERE b.专业号= a.专业号 AND b.年级= a.年级) AS 数量
FROM (Step4的语句) a
t3.nj as nj,
t3.zydm as zydm,
sum(counts) as newCount
from (
select
t1.StuTuiTionID,
t1.nj,
t1.zydm,
(selcet
COUNT(*)
from
Fina_Must t2
where
t2.StuTuiTionID = t1.StuTuiTionID and
t2.Grade = t1.nj and
t2.SpeciltyID = t1.zydm and
t2.id = (select
max(fm.id)
from
Fina_Must fm
where
fm.StuTuiTionID = t2.StuTuiTionID and
fm.Grade = t2.Grade and
fm.SpeciltyID = t2.SpeciltyID and
fm.Year = t2.Year and
fm.Term = t2.Term
)
and t2.Year = ¶m_Year and
t2.Term = ¶m_Term
) as counts
from
Fina_Student t1
) t3
group by
t3.nj, t3.zydm
t3.nj as nj,
t3.zydm as zydm,
count(*) as newCount
from (
select
t1.StuTuiTionID,
t1.nj,
t1.zydm,
(selcet
count(*)
from
Fina_Must t2
where
t2.StuTuiTionID = t1.StuTuiTionID and
t2.Grade = t1.nj and
t2.SpeciltyID = t1.zydm and
Year = ¶m_Year and
Term = ¶m_Term
) as counts
from
Fina_Student t1
) t3
where
t3.counts <> 0
group by
nj, zydmunion allselect
t4.nj as nj,
t4.zydm as zydm,
0 as newCount
from
Fina_Student t4
where
not exists(select
*
from
Fina_Must t5
where
t5.Grade = t4.nj and
t5.SpeciltyID = t4.zydm and
t5.Year = ¶m_Year and
t5.Term = ¶m_Term
)
group by
nj,zydm,
t3.nj as nj,
t3.zydm as zydm,
sum(counts) as newCount
from (
select
t1.StuTuiTionID,
t1.nj,
t1.zydm,
(selcet
decode(COUNT(*),0,0,1) --//此时COUNT(*)只有1和0
from
Fina_Must t2
where
t2.StuTuiTionID = t1.StuTuiTionID and
t2.Grade = t1.nj and
t2.SpeciltyID = t1.zydm and
t2.Year = ¶m_Year and
t2.Term = ¶m_Term
) as counts
from
Fina_Student t1
) t3
group by
t3.nj, t3.zydm说一下以上SQL的思路以Fina_Student为基表进行逐条遍历,并为其增加一个列counts ,如果在Fina_Must表中能找到符合条件(参考WHERE部分)的通知单纪录则记counts为1(说明该学生这个学年学期有通知单),否则记counts为0(没有通知单),最后把查出的结果集按年级和专业进行分组,同时累计出同年级同专业上的各个counts通知单个数总和,输出结果为newCount。使用union all的那个应该好理解一些,不说明了