T-SQL 列表达式排序

首先,看以下代码

SELECT T.姓名,T.班级,SUM(T.得分) AS 总得分
FROM (SELECT 姓名,班级,科目,得分
FROM [成绩表$]
UNION ALL
SELECT 班级&"小计" AS 姓名,班级,科目,AVG(得分)
FROM [成绩表$]
GROUP BY 科目,班级
UNION ALL
SELECT "合计" AS 姓名,null AS 班级,科目,AVG(得分)
FROM [成绩表$]
GROUP BY 科目) T
GROUP BY T.姓名,T.班级,(T.班级=班级&"小计"),(T.班级="合计")
ORDER BY (T.班级="合计") DESC,(T.班级=班级&"小计") ,T.班级 


 

不是很好理解,我们可以尝试猜测一下:

1,这段代码的意图是,实现”合计“行在第一行,然后是几个“小计”行,最后是详细的“姓名”行;

2,如果条件1成立,那么,我们可以推断,这里的“T.班级”是笔误,正确的应该改为“T.姓名”;

3,这段代码不能在SQL SERVER中运行。

 

假设上述猜测成立,我们可以在SQL SERVER中模仿一下,这段代码实现的效果。

先看一下样表

student class subjects score
a1 1 math 70
a1 1 english 80
a2 1 math 75
a2 1 english 77
b1 2 math 88
b1 2 english 65
b2 2 math 90
b2 2 english 95
b3 2 math 55
b3 2 english 69

在SQL SERVER中,要实现上述代码的效果,我们可以使用列表达式。

SELECT T.student,T.class,SUM(score)AS score FROM
(SELECT student,class,subjects,score FROM dbo.t10
UNION ALL
SELECT Cast(class AS nvarchar(10))+'班小计' AS student,class,subjects,AVG(score) FROM dbo.t10
GROUP BY class,subjects
UNION ALL
SELECT '合计' AS student,NULL AS class, subjects,AVG(score) FROM dbo.t10
GROUP BY subjects
) AS T
GROUP BY T.student,T.class
ORDER BY
CASE WHEN t.student ='合计' THEN class END DESC,
CASE WHEN NOT t.student LIKE '%计' THEN class END ASC,
CASE WHEN t.student LIKE '%小计' THEN class END ASC;

执行后,如下:
student class score
合计 NULL 152
1班小计 1 150
2班小计 2 153
a1 1 150
a2 1 152
b1 2 153
b2 2 185
b3 2 124

 

通过这个例子,我们可以了解,在SQL SERVER中,使用列表达式,可以实现指定的排序,满足特定的要求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值