MS access 2010 SQL查询帮助
Posted
技术标签:
【中文标题】MS access 2010 SQL查询帮助【英文标题】:MS access 2010 SQL query Help 【发布时间】:2011-07-04 12:26:18 【问题描述】:我怎样才能从这个表格中转一张桌子:
S_ID SUBJECT MARK
1 English 90
1 Math 40
1 Computer 30
2 English 85
2 Math 10
2 Computer 06
3 English 10
3 Math 20
3 Computer 40
到这个表格
S_ID English Math Computer
1 90 40 30
2 85 10 06
3 10 20 40
使用 SQL 代码,
我使用的是 MS Access 2010,
谢谢
【问题讨论】:
【参考方案1】:SELECT S_ID ,
MAX(CASE WHEN subject = 'English' THEN mark ELSE null END) AS English,
MAX(CASE WHEN subject = 'Math' THEN mark ELSE null END) AS Math,
MAX(CASE WHEN subject = 'Computer' THEN mark ELSE null END) AS Computer
FROM myTable
GROUP BY S_ID
【讨论】:
+1 可以省略else null
,不匹配的case
默认返回null
期待测试一下,谢谢 :) @HansUp :Access 支持 SWITCH 语句,和 CASE WHEN 一样吗?
Scorpi0:如果您要添加一个ELSE null
子句,那么您不应该也将null
转换为与mark
相同的类型吗?
@onedaywhen :说真的,投一个 null ?你是认真的吗?
...请注意,Access 数据库引擎(ACE、Jet 等)均不支持 CASE
和类型转换 NULL
。【参考方案2】:
您需要一个交叉表查询,它会为每个主题生成一列;
TRANSFORM Sum(MARK) AS TotalMark
SELECT
S_ID
FROM marks
GROUP BY S_ID
PIVOT SUBJECT;
【讨论】:
-虽然它有效,但我正在寻找适用于 mysql 的东西,更通用的 SQL 方法非常感谢您的回复,当然也投了赞成票 :) -另一件事是我不想要总数(交叉表),我想要一个学生的“列表”,如我的问题所示。 :) 只要每个学生每个科目有一个标记,那么SUM()
就可以了,因为你只会对一个值求和,另一个像MIN()/MAX()
这样的聚合同样会给出同样的结果。对于 mySQL,您可以使用 Scorpi0 的答案将 CASE
替换为 sum( if(itemname = 'english', mark, 0))
- 访问也有类似的 iif()
- 我怀疑您是否会找到一种优雅的跨数据库方式,特别是如果其中一个是访问。
“我怀疑您是否会找到一种优雅的跨数据库方式,特别是如果其中之一是 Access。”完全同意【参考方案3】:
如果这是一次性练习,您可以按顺序使用多个语句:如下所示:
insert into new_table
select distinct s_id, 0,0,0
from old_table
然后是一系列的更新
update new_table n
set english = (select english from old_table where s_id = n.s_id )
where s_id = n.s_id
【讨论】:
以上是关于MS access 2010 SQL查询帮助的主要内容,如果未能解决你的问题,请参考以下文章