- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我怀疑这与我在 SELECT 语句中有 case 语句然后我试图对此执行 GROUP BY 和 ORDER BY 语句有关。
我有一个基于两个表之间的连接的结果集。一个是学生表,其中 ks2en、ks2ma 和 Ks2av 列的值为 2c、2b、2a、3c、3b 等,第二个是每个学生的结果表,例如 A+、A、A-、B+ 等。值在ks2en、ks2ma 和 Ks2av 列被分组并对结果求和,这给出了一个总计网格,其中水平在左边,结果在顶部。然而Ks2en、Ks2ma和Ks2av这三种level应该根据特定的主题带来结果:
Ks2en - English Result
Ks2ma - Maths Result
Ks2av - Any other subject Result
如果 ks2en、ks2ma 或 ks2av 列中没有值,我希望分组依据显示为“No KS2”。
我在底部的代码非常适合英语和 Ks2en,但我正在努力找出根据主题是英语、数学还是其他任何内容来更改结果的逻辑。
主题通过名为@SubjectName 的变量填充。
下面是我希望我的 sql 执行的伪代码:
If @SubjectName = 'English' then
If ks2en ='' then
display 'No KS2'
else Ks2en
endif
Else if @SubjectName = 'Mathematics' then
If ks2ma ='' then
display 'No KS2'
else Ks2ma
endif
Else if @SubjectName <> 'English' and @SubjectName <> 'Mathematics' then
If ks2av ='' then
display 'No KS2'
else Ks2av
endif
这是我目前为止在@SubjectName = 'English' 时有效的代码:
DECLARE
@DataCollection varchar(50) = '2013/14 - Autumn 1 - Targets',
@StuYear VARCHAR(2) = '11',
@SubjectName varchar(100) ='English',
@TeachingGroup varchar(25) = 'Select All',
@SubGroup varchar(10) = 'Select All'
SELECT CASE WHEN Ks2en = '' and @SubjectName = 'English' THEN 'No KS2' ELSE ks2en END AS 'KS2',
nullif(count(CASE WHEN result = '' THEN 1 END),0) AS 'No Level/Grade',
nullif(count(CASE WHEN result IN ('U', '1a', '1b', '1c') THEN 1 END),0) AS '1/U',
nullif(count(CASE WHEN result IN ('U', '2a', '2b', '2c') THEN 1 END),0) AS '2/U',
nullif(count(CASE WHEN result IN ('G-','3c') THEN 1 END),0) AS '3c/G-',
nullif(count(CASE WHEN result IN ('G', '3b') THEN 1 END),0) AS '3b/G',
nullif(count(CASE WHEN result IN ('G+','3a') THEN 1 END),0) AS '3a/G+',
nullif(count(CASE WHEN result IN( 'F-','4c') THEN 1 END),0) AS '4c/F-',
nullif(count(CASE WHEN result IN( 'F', '4b') THEN 1 END),0) AS '4b/F',
nullif(count(CASE WHEN result IN( 'F+', '4a') THEN 1 END),0) AS '4a/F+',
nullif(count(CASE WHEN result IN( 'E-', '5c') THEN 1 END),0) AS '5c/E-',
nullif(count(CASE WHEN result IN( 'E', '5b') THEN 1 END),0) AS '5b/E',
nullif(count(CASE WHEN result IN( 'E+', '5a') THEN 1 END),0) AS '5a/E+',
nullif(count(CASE WHEN result IN( 'D-', '6c') THEN 1 END),0) AS '6c/D-',
nullif(count(CASE WHEN result IN( 'D', '6b') THEN 1 END),0) AS '6b/D',
nullif(count(CASE WHEN result IN( 'D+', '6a') THEN 1 END),0) AS '6a/D+',
nullif(count(CASE WHEN result IN( 'C-', '7c') THEN 1 END),0) AS '7c/C-',
nullif(count(CASE WHEN result IN( 'C', '7b') THEN 1 END),0) AS '7b/C',
nullif(count(CASE WHEN result IN( 'C+', '7a') THEN 1 END),0) AS '7a/C+',
nullif(count(CASE WHEN result IN( 'B-', '8c') THEN 1 END),0) AS '8c/B-',
nullif(count(CASE WHEN result IN( 'B', '8b') THEN 1 END),0) AS '8b/B',
nullif(count(CASE WHEN result IN( 'B+', '8a') THEN 1 END),0) AS '8a/B+',
nullif(count(CASE result WHEN 'A-' THEN 1 END),0) AS 'A-',
nullif(count(CASE result WHEN 'A' THEN 1 END),0) AS 'A',
nullif(count(CASE result WHEN 'A+' THEN 1 END),0) AS 'A+',
nullif(count(CASE result WHEN 'A*-' THEN 1 END),0) AS 'A*-',
nullif(count(CASE result WHEN 'A*' THEN 1 END),0) AS 'A*'
FROM student JOIN subject
ON subject.upn=student.upn
WHERE
[StuYear] = @StuYear AND
[DataCollection] = @DataCollection AND
[Name] = @SubjectName AND (
@TeachingGroup = 'Select All' OR
[TeachingGroup] = @TeachingGroup
) AND (
@SubGroup = 'Select All' OR
Gender = CASE
WHEN @SubGroup = 'GenF' THEN 'F'
WHEN @SubGroup = 'GenM' THEN 'M'
END
)
GROUP BY ks2en
ORDER BY
CASE WHEN ks2en = 'W' THEN 0 ELSE 1 END,
LEFT(ks2en, 1),
RIGHT(ks2en, 1) DESC
如果@SubjectName = 'Mathematics' 那么该语句将有效地执行与以下相同的操作:
DECLARE
@DataCollection varchar(50) = '2013/14 - Autumn 1 - Targets',
@StuYear VARCHAR(2) = '11',
@SubjectName varchar(100) ='Mathematics',
@TeachingGroup varchar(25) = 'Select All',
@SubGroup varchar(10) = 'Select All'
SELECT CASE WHEN Ks2ma = '' and @SubjectName = 'Mathematics' THEN 'No KS2' ELSE ks2ma END AS 'KS2',
nullif(count(CASE WHEN result = '' THEN 1 END),0) AS 'No Level/Grade',
**SNIP**
nullif(count(CASE result WHEN 'A*' THEN 1 END),0) AS 'A*'
FROM student JOIN subject
ON subject.upn=student.upn
WHERE
[StuYear] = @StuYear AND
[DataCollection] = @DataCollection AND
[Name] = @SubjectName AND (
@TeachingGroup = 'Select All' OR
[TeachingGroup] = @TeachingGroup
) AND (
@SubGroup = 'Select All' OR
Gender = CASE
WHEN @SubGroup = 'GenF' THEN 'F'
WHEN @SubGroup = 'GenM' THEN 'M'
END
)
GROUP BY ks2ma
ORDER BY
CASE WHEN ks2ma = 'W' THEN 0 ELSE 1 END,
LEFT(ks2ma, 1),
RIGHT(ks2ma, 1) DESC
如果@SubjectName 等于任何其他内容,例如 Science、Art 或 Technology,那么 SQL 会喜欢以下内容:
DECLARE
@DataCollection varchar(50) = '2013/14 - Autumn 1 - Targets',
@StuYear VARCHAR(2) = '11',
@SubjectName varchar(100) ='Science',
@TeachingGroup varchar(25) = 'Select All',
@SubGroup varchar(10) = 'Select All'
SELECT CASE WHEN Ks2av = '' and @SubjectName <> 'Mathematics' and @SubjectName <> 'English' THEN 'No KS2' ELSE ks2av END AS 'KS2',
nullif(count(CASE WHEN result = '' THEN 1 END),0) AS 'No Level/Grade',
**SNIP**
nullif(count(CASE result WHEN 'A*' THEN 1 END),0) AS 'A*'
FROM student JOIN subject
ON subject.upn=student.upn
WHERE
[StuYear] = @StuYear AND
[DataCollection] = @DataCollection AND
[Name] = @SubjectName AND (
@TeachingGroup = 'Select All' OR
[TeachingGroup] = @TeachingGroup
) AND (
@SubGroup = 'Select All' OR
Gender = CASE
WHEN @SubGroup = 'GenF' THEN 'F'
WHEN @SubGroup = 'GenM' THEN 'M'
END
)
GROUP BY ks2av
ORDER BY
CASE WHEN ks2av = 'W' THEN 0 ELSE 1 END,
LEFT(ks2av, 1),
RIGHT(ks2av, 1) DESC
我的 SQL 生成的网格类似于下图。结果集看起来很简单,但是背景数据将基于上面讨论的不同标准,并且会在每个单元格中产生不同的总数:
KS2 No Result 1/U 2/U 3c/G- 3b/G 3a/G+ 4c/F- 4b/F **snip**
No KS2 1 NULL NULL NULL NULL NULL NULL **snip**
2a NULL NULL NULL NULL NULL NULL 2 1 **snip**
3c 1 NULL NULL NULL NULL NULL NULL NULL **snip**
3b NULL NULL NULL NULL NULL NULL 1 NULL **snip**
3a 1 NULL NULL NULL NULL NULL NULL NULL **snip**
4c NULL 1 1 NULL NULL NULL NULL NULL **snip**
4b NULL NULL NULL NULL NULL NULL NULL NULL **snip**
4a NULL 1 1 NULL NULL NULL NULL NULL **snip**
5c NULL NULL NULL NULL NULL NULL NULL NULL **snip**
5b NULL NULL NULL NULL NULL NULL NULL NULL **snip**
最佳答案
如果我没看错的话,你其实可以自己处理任务,除了过滤。我的意思是,除了通过“英语/数学/其他”对结果进行分支/调节外,您的问题在于它们几乎相同,只是它们来自不同的列并且您希望将它们统一串接。
对不起,如果这不是您的实际问题,但我是这样阅读/理解的。
由于多种原因,我目前无法给您一个准确的完整答案(即我不知道 F+ G- 等成绩与 3a
6b
有何关系values ),但我至少可以给你一些帮助/启动你如何解决这类问题。
你想要的效果:
If @SubjectName = 'English' then If ks2en ='' then ....
else If @SubjectName = 'Maths' then If ks2ma ='' then ....
else If ks2av ='' then ....
这很容易通过一些初步的重新排列您的输入表来完成。简单地说,只需将有趣的部分过滤成 block 并添加一些常量值,这些值将充当有关该 block 的方便元数据:
select "English" as topic, ks2en as ks2
from YourTable
where ks2en <> ''
union all
select "Mathematics" as topic, ks2ma as ks2
from YourTable
where ks2ma <> ''
union all
select "Other" as topic, ks2av as ks2
from YourTable
where ks2av <> ''
请注意,我添加了一个名为 topic
的额外计算键值,这些数据现在重新排列为 2 列。您现在无法区分 ks2en
和 ks2ma
,但是您有一个 ks2
并且您可以通过常量 topic 检测它来自什么
列。
现在:
select
case when subq.ks2 = '' then 'No KS2'
else subq.ks2
end
from
(
select "English" as topic, ks2en as ks2 from YourTable where ks2en <> ''
union all select "Mathematics" as topic, ks2ma as ks2 from YourTable where ks2ma <> ''
union all select "Other" as topic, ks2av as ks2 from YourTable where ks2av <> ''
) subq
where subq.topic = @SubjectName
(为了整体可读性,我压缩了选择/联合部分)
将为您返回 KS2
以获得您想要的实际 SubjectName
。除了 Other
部分显然不会匹配任何内容,因为“Physics”与“Other”不匹配。您可以通过检查 SubjectName 的已知值并将其设置为“其他”来轻松解决这个问题。或者其他什么。
要点在于,多亏了初步的过滤描述和粘附,您可以按照您想要的任何方式 reshape 数据,然后轻松地将其分组/投影到您真正想要的内容中。
编辑:我不知道它是否存在于 sql2008 级别,但我认为您还可以检查可以转置列的 PIVOT
/UNPIVOT
运算符<->行。它们使用起来很棘手,有一些限制使它们远不如它们应该的那样方便,但值得检查。当然,假设我很好地理解了你问题的核心。对不起,如果没有。
关于sql-server-2008 - SQL 条件选择案例逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19027511/
我正在努力处理查询的 WHERE 部分。查询本身包含一个基于两个表中都存在的 ID 的 LEFT JOIN。但是,我要求 where 语句仅返回其中一列中存在的最大单个结果。目前我返回连接中的所有值,
我有这个代码来改变文件系统的大小。问题是,即使满足 if 条件,它也不会进入 if 条件,而我根本没有检查 if 条件。它直接进入 else 条件。 运行代码后的结果 post-install-ray
假设我有一个包含 2 列的 Excel 表格:单元格 A1 到 A10 中的日期和 B1 到 B10 中的值。 我想对五月日期的所有值求和。我有3种可能性: {=SUM((MONTH(A1:A10)=
伪代码: SELECT * FROM 'table' WHERE ('date' row.date 或 ,我们在Stack Overflow上找到一个类似的问题: https://stackove
我有下面这行代码做一个简单的查询 if ($this->fulfilled) $criteria->addCondition('fulfilled ' . (($this->fulfilled
如果在数据库中找到用户输入的键,我将尝试显示“表”中的数据。目前我已将其设置为让数据库检查 key 是否存在,如下所示: //Select all from table if a key entry
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 5 年前。 Improve th
在MYSQL中可以吗 一共有三个表 任务(task_id、task_status、...) tasks_assigned_to(ta_id、task_id、user_id) task_suggeste
我想先根据用户的状态然后根据用户名来排序我的 sql 请求。该状态由 user_type 列设置: 1=活跃,2=不活跃,3=创始人。 我会使用此请求来执行此操作,但它不起作用,因为我想在“活跃”成员
下面两个函数中最专业的代码风格是什么? 如果函数变得更复杂和更大,例如有 20 个检查怎么办? 注意:每次检查后我都需要做一些事情,所以我不能将所有内容连接到一个 if 语句中,例如: if (veh
我在 C# 项目中使用 EntityFramework 6.1.3 和 SQL Server。我有两个查询,基本上应该执行相同的操作。 1. Exams.GroupBy(x=>x.SubjectID)
我试图在 case when 语句中放入两个条件,但我在 postgresql 中遇到语法错误 case when condition 1 and condition 2 then X else Y
我正在构建一个连接多个表的查询,一个表 prodRecipe 将包含某些行的数据,但不是全部,但是 tmp_inv1 将包含所有行的计数信息。问题是,tmp_inv1.count 取决于某个项目是否在
我有一个涉及 couples of rows which have a less-than-2-hours time-difference 的查询(~0.08333 天): SELECT mt1.*,
我有一个包含许多这样的 OR 条件的代码(工作正常)来检查其中一个值是否为空,然后我们抛出一条错误消息(所有这些都必须填写) } elsif ( !$params{'account'}
我有一个名为 spGetOrders 的存储过程,它接受一些参数:@startdate 和 @enddate。这将查询“订单”表。表中的一列称为“ClosedDate”。如果订单尚未关闭,则此列将保留
在代码中,注释部分是我需要解决的问题...有没有办法在 LINQ 中编写这样的查询?我需要这个,因为我需要根据状态进行排序。 var result = ( from contact in d
我正在尝试创建一个允许省略参数的存储过程,但如果提供了参数,则进行 AND 操作: CREATE PROCEDURE MyProcedure @LastName Varchar(30)
我正在寻找一种方法来过滤我的主机文件中的新 IP 地址。我创建了一个脚本,每次我用来自矩阵企业管理器的数据调用它时都会更新我的主机文件。它工作正常。但是我必须找到一个解决方案,只允许更新 10.XX.
所以我正在做一种 slider ,当它完全向下时隐藏向下按钮,反之亦然,当向上按钮隐藏时,我遇到了问题。 var amount = $('slide').attr('number'); $('span
我是一名优秀的程序员,十分优秀!