我有一张桌子
StudentID StudentName Subject Marks
1 Savita EC1 50
1 Savita EC2 55
1 Savita EC3 45
1 Savita EC4 34
1 Savita EC5 23
2 Rajesh EC1 34
2 Rajesh EC2 56
2 Rajesh EC3 12
2 Rajesh EC4 45
2 Rajesh EC5 23
3 Smita EC1 76
3 Smita EC2 45
3 Smita EC3 67
3 Smita EC4 56
3 Smita EC5 76
4 Rahul EC1 66
4 Rahul EC2 34
4 Rahul EC3 22
4 Rahul EC4 18
4 Rahul EC5 33
我写了一个查询,如
SELECT StudentName, EC1,EC2,EC3,EC4,EC5,TotalMarks, case
when EC1<30 and ec2<30 then 'fail'
when EC1<30 and EC3<30 then 'fail'
when EC1<30 and EC4<30 then 'fail'
when EC1<30 and EC5<30 then 'fail'
when EC2<30 and EC3<30 then 'fail'
when EC2<30 and EC4<30 then 'fail'
when EC2<30 and EC5<30 then 'fail'
when EC3<30 and EC4<30 then 'fail'
when EC3<30 and EC5<30 then 'fail'
when EC4<30 and EC5<30 then 'fail'
else 'pass'
end as Result
FROM (SELECT StudentName, EC1, EC2, EC3, EC4, EC5, TotalMarks=EC1+EC2+EC3+EC4+EC5
FROM Student
PIVOT(sum(Marks) for subject in([EC1],[EC2],[EC3],[EC4],[EC5],[TotalMarks]))as pivotTable) A
这将在2个科目中得分低于30分的学生的输出为不及格或及格
Rahul 66 34 22 18 33 173 fail
Rajesh 34 56 12 45 23 170 fail
Savita 50 55 45 34 23 207 pass
Smita 76 45 67 56 76 320 pass
我想给每门少于30分的科目加7分,然后在加7分后看到那些及格不及格的学生。例如添加7个标记后,rajesh记录应该是这样的
Rajesh 34 56 19 45 30 170通过
你可以试试这个
SELECT
StudentName,
CASE WHEN EC1 < 30 THEN EC1 + 7 ELSE EC1 END AS EC1,
CASE WHEN EC2 < 30 THEN EC2 + 7 ELSE EC2 END AS EC2,
CASE WHEN EC3 < 30 THEN EC3 + 7 ELSE EC3 END AS EC3,
CASE WHEN EC4 < 30 THEN EC4 + 7 ELSE EC4 END AS EC4,
CASE WHEN EC5 < 30 THEN EC5 + 7 ELSE EC5 END AS EC5,
Total = (EC1 + EC2 + EC3 + EC4 + EC5),
CASE
WHEN EC1 < 23 AND EC2 < 23 THEN 'FAIL'
WHEN EC1 < 23 AND EC3 < 23 THEN 'FAIL'
WHEN EC1 < 23 AND EC4 < 23 THEN 'FAIL'
WHEN EC1 < 23 AND EC5 < 23 THEN 'FAIL'
WHEN EC2 < 23 AND EC3 < 23 THEN 'FAIL'
WHEN EC2 < 23 AND EC4 < 23 THEN 'FAIL'
WHEN EC2 < 23 AND EC5 < 23 THEN 'FAIL'
WHEN EC3 < 23 AND EC4 < 23 THEN 'FAIL'
WHEN EC3 < 23 AND EC5 < 23 THEN 'FAIL'
WHEN EC4 < 23 AND EC5 < 23 THEN 'FAIL'
ELSE 'PASS'
END AS Result
FROM
(
SELECT * FROM Student
) AS ST
PIVOT
(
SUM(Marks) For [Subject] IN (EC1, EC2, EC3, EC4, EC5)
) AS PV
输出
Rahul 66 34 29 25 33 173 FAIL
Rajesh 34 56 19 45 30 170 PASS
Savita 50 55 45 34 30 207 PASS
Smita 76 45 67 56 76 320 PASS
您可以使用窗口版本的SUM
、COUNT
聚合函数来简化查询:
SELECT StudentID, StudentName,
[EC1],[EC2],[EC3],[EC4],[EC5],
Total,
CASE WHEN Below30 >= 2 THEN 'Fail'
ELSE 'Pass'
END AS WithoutBonus,
CASE WHEN Below23 >= 2 THEN 'Fail'
ELSE 'Pass'
END AS WithBonus
FROM (SELECT StudentID, StudentName, Subject, Marks,
SUM(Marks) OVER (PARTITION BY StudentID) AS Total,
COUNT(CASE WHEN Marks < 30 THEN 1 END)
OVER (PARTITION BY StudentID) AS Below30,
COUNT(CASE WHEN Marks < 23 THEN 1 END)
OVER (PARTITION BY StudentID) AS Below23
FROM mytable ) AS src
PIVOT (
MAX (Marks)
FOR Subject IN ([EC1],[EC2],[EC3],[EC4],[EC5]) ) pvt
ORDER BY StudentName
低于30
计算具有标记的受试者数量
因此,如果一个特定的学生有2门或更多科目的分数为,则
WithoutBonus
为“不及格”
此处演示
如果要输出
标记
值加7,以防它们是
SELECT StudentID, StudentName,
[EC1],[EC2],[EC3],[EC4],[EC5],
Total,
CASE WHEN Below23 >= 2 THEN 'Fail'
ELSE 'Pass'
END AS WithBonus
FROM (SELECT StudentID, StudentName, Subject,
CASE WHEN Marks < 30 THEN Marks+7 ELSE Marks END AS Marks,
SUM(Marks) OVER (PARTITION BY StudentID) AS Total,
COUNT(CASE WHEN Marks < 23 THEN 1 END) OVER (PARTITION BY StudentID) AS Below23
FROM mytable ) AS src
PIVOT (
MAX (Marks)
FOR Subject IN ([EC1],[EC2],[EC3],[EC4],[EC5]) ) pvt
ORDER BY StudentName
输出:
StudentID StudentName EC1 EC2 EC3 EC4 EC5 Total WithBonus
--------------------------------------------------------------
4 Rahul 66 34 29 25 33 173 Fail
2 Rajesh 34 56 19 45 30 170 Pass
1 Savita 50 55 45 34 30 207 Pass
3 Smita 76 45 67 56 76 320 Pass
也许这就是你要找的东西:
SELECT A.StudentName, EC1,EC2,EC3,EC4,EC5,Total,
case when fail2 >= 2 then 'Failure'
when fail >= 2 then 'Near Pass'
else 'Pass' end as Result
FROM
( SELECT StudentName, EC1, EC2, EC3, EC4, EC5
FROM Student
PIVOT(sum(Marks) for subject in([EC1],[EC2],[EC3],[EC4],[EC5]))as pt) A,
( select
studentName,
sum(case when Marks < 30 then 1 else 0 end) as fail,
sum(case when Marks < 23 then 1 else 0 end) as fail2,
sum(case when Marks >= 30 then 1 else 0 end) as pass,
sum(marks) as total
from
student
group by
studentname
) B
where
A.StudentName = B.StudentName
我删除了您针对所有失败组合的比较逻辑,并将其替换为原始表中的“按案例分组求和”,这样您就可以确定每个学生的失败、接近通过和通过次数,而不必单独列出所有案例。
您可以在 SQL 小提琴中对此进行测试
问题内容: 我有桌子 我写了一个查询 给出在两个科目中得分不超过30分的学生的成绩为不及格或不及格 我想为少于30的每个科目添加7分,并在添加7分后查看通过不及格的学生。例如-在添加7个标记之后,rajesh记录应该像 问题答案: 你可以试试这个 输出
问题内容: 我正在寻找一种方法来调整以下结果… 分为以下结构。 列数是固定的(它将始终是部门/部门/类别)。该查询适用于Sybase。。。尚无法弄清楚如何实现这种转换。有什么建议吗? 问题答案: 您需要一些键来定义3行的集合。然后,您就可以自我加入 所以对于这样的数据… 你会
问题内容: 我正在使用MySQL。这是我的桌子 我需要一个选择查询来显示类似这样的表。 问题答案: 您可以使用此查询- 它产生您想要的结果。但是,如果您想动态地进行操作,请参阅这篇文章“自动执行数据透视表查询”-http: //www.artfulsoftware.com/infotree/queries.php#523,或者该链接- 动态数据透视表。
问题内容: 我在表中有数据,如下所示: 我想编写一个SQL查询,以便给出如下结果: 问题答案: Oracle 9i +支持: 您只列出了两列-可能应按年份将类似的内容分组。 有ANSI PIVOT(和UNPIVOT)语法,但是Oracle直到11g才支持它。在9i之前,您必须将CASE语句替换为Oracle特定的DECODE。
问题内容: 以下查询执行得很好… 输出看起来像 但是我的疑问是如何获取列的动态字段值。 那是 , 如何使用以上查询 问题答案: 要使PIVOT动态,您必须编写一个存储过程。 然后,您可以这样称呼它:
在我的Laravel应用程序中,我有三个数据库表,分别称为users、projects和roles。它们之间存在m:n关系,所以我也有一个称为PROJECT_USER_ROLE的透视表。透视表包含user_id、project_id和role_id列。请参见MySQL工作台的屏幕截图。 我的用户、项目和角色模型得到了如下定义的归属关系: 现在我可以很容易地获得通过身份验证的用户的项目: 对此的回应