SQL问题,高手请进(200分)

  • 主题发起人 主题发起人 太阳河上
  • 开始时间 开始时间

太阳河上

Unregistered / Unconfirmed
GUEST, unregistred user!
有以下数据结构:
字段名 注明
KH    学号
KM    科目
FS    分数
....
KH KM FS
1 数学   80
2      数学   60
.....
1      英语   65
2      英语   70
当查询后想这样显示:
学号   数学   英语
1 80 65 
2 60 70
....
用SQL能做能吗?     
 
可以啊,是什么数据库?
 
smallbs:
是Access数据库,请给出SQL语句,谢谢
 
Transform sum(fs)
select kh as 学号 from table1 group by kh
pivot km
 
QuickSilver,smallbs两位:
你们给出的sql语句在Access中无法运行,不知为何?
 
QuickSilver:
我知道Table1改变成我的数据名,但我在sql Explorer中测试不行,提示错误.
谢谢
 
SELECT DISTINCT a.KH, b.数学, c.英语
FROM TABLE AS A, [SELECT KH, FS as 数学 FROM TABLE WHERE KM='数学']. AS b,
[SELECT KH, FS as 英语 FROM TABLE WHERE KM='英语']. AS c
WHERE a.KH=b.KH
and a.KH=c.KH
 
QuickSilver:
在SQL Explorer中,select kh as 学号 from table1 group by kh可以,但加上
pivot km则出错
谢谢
 
QuickSilver:
我想在Delphi中通过ADOQueyr来查询,这样不行吗?
 
select kh,sum(iif(km='数学',fs,0)),sum(iif(km='英语',fs,0))
from tablename
group by kh
 
Transform是Access中专用的交叉表函数
可在Access中建立查询来验证,也可通过Adoquery调用(Adoconnection必须连在ACCESS上)。
 
QuickSilver:
还可以说具体点吗?最好有写出AdoQuery的SQL语句.
谢谢
 
ugvanxk:
按你的方法,无法运行,是Access数据库吧?但我用不了。
谢谢
 
SELECT DISTINCT a.KH, b.数学, c.英语
FROM TABLE AS A, (SELECT KH, FS as 数学 FROM TABLE WHERE KM='数学') AS b,
(SELECT KH, FS as 英语 FROM TABLE WHERE KM='英语') AS c
WHERE a.KH=b.KH
and a.KH=c.KH
 
select DISTINCT KH as 学号,KM as 数学,FS as 英语 from table1
SELECT DISTINCT t1.KH AS 学号, t1.KM AS 数学, t2.FS AS 英语
FROM (SELECT *
FROM table1
WHERE (KM = '英语')) t2 INNER JOIN
(SELECT *
FROM table1
WHERE (KM = '数学')) t1 ON t2.KH = t1.KH CROSS JOIN
table1
 
adoquery1.Close;
adoquery1.SQL.clear;
adoquery1.sql.Add('Transform sum(fs) select kh as 学号 from table1 group by kh pivot km');
adoquery1.Open;
其实你在ACCESS中直接建立查询就可以验证了。
 
smallbs:
你的:
SELECT DISTINCT a.KH, b.数学, c.英语
FROM TABLE AS A, [SELECT KH, FS as 数学 FROM TABLE WHERE KM='数学']. AS b,
[SELECT KH, FS as 英语 FROM TABLE WHERE KM='英语']. AS c
WHERE a.KH=b.KH
and a.KH=c.KH
可以解决问题,但这样的语句稍长,不知还有更好的方法吗?
等下给分
 
QuickSilver:
我按的方法进行,但出现:
Data Type mismath in criteria expression 错误。
 
QuickSilver 的方法就是更好的方法了,能用的
 
后退
顶部