我想显示一个显示成绩分布的ASP.NET Chart控件。
它应该显示有多少学生获得了从A到F的等级。
在没有学生获得D字母等级的情况下,如何使图表包括A,B,C,D,F等级?例如,我希望D值显示在X轴上,但学生数为零。
正在从数据库中提取数据,我正在使用ObjectDataSource绑定到图表控件。
编辑:数据的结构是有一个学生表,每个stundent都有一个FirstName,LastName和Grade。
编辑:对于网站的其余部分,我正在使用带有LINQ的实体框架(而不是编写原始SQL),因此,在完美的世界中,解决方案不会涉及原始SQL。答案 0 :(得分:0)
是否可以更改您的查询包括所有成绩然后填写每个成绩的详细信息? 完全破解 - 但是为了向您展示我不知道您的架构的想法
select * from ( select 'a' Grade union select 'b' Grade union select 'c' Grade union select 'd' Grade union select 'f' Grade ) as grades g outer join yourothertable t on g.Grade = t.Grade
编辑:在阅读完编辑后,意识到你不希望这是一个sql解决方案,那么选择是获取你的对象并对它们进行linq连接到包含等级的对象。
请参阅: http://www.hookedonlinq.com/OuterJoinSample.ashx 使用类似的东西 公共班级 { 公共字符串LetterGrade; } 填充它们的列表,并对查询中的结果执行外部联接。您的新linq结果集合就是您现在的数据绑定。
答案 1 :(得分:0)
如果不知道您的数据是如何构建的,那么给出详细的答案有点困难。这是使用SQL公用表表达式(CTE)执行此操作的方法。它将组织数据,以便您可以轻松地将其绑定到图表控件。
这将产生如下数据表:
| Grade | TotalGrades |
|-------|-------------|
| A | 2 |
| B | 1 |
| C | 2 |
| D | 0 |
| E | 0 |
| F | 1 |
这是代码:
;With Grades (Grade) as
(
SELECT 'A' Grade
UNION
SELECT 'B' Grade
UNION
SELECT 'C' Grade
UNION
SELECT 'D' Grade
UNION
SELECT 'E' Grade
UNION
SELECT 'F' Grade
),
GradeResults (Name,Grade) as
(
SELECT 'John','A'
UNION
SELECT 'Sally','B'
UNION
SELECT 'Dave','C'
UNION
SELECT 'Charlie','C'
UNION
SELECT 'Lisa','F'
UNION
SELECT 'Russ','A'
)
SELECT a.Grade, COUNT(b.Grade) as TotalGrades FROM Grades a LEFT OUTER JOIN GradeResults b on a.Grade = b.Grade
GROUP BY a.Grade
ORDER BY a.Grade;