DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: snarv
今日帖子: 12
在线用户: 14
导航: 论坛 -> 数据库专区 斑竹:liumazi,waterstone  
作者:
男 freewyl (freewyl) ★☆☆☆☆ -
盒子活跃会员
2004/2/27 16:43:08
标题:
如何现实带汉字的字段——交叉表 浏览:1581
加入我的收藏
楼主: 如有如下表:
学号   姓名   课程  成绩
1      李四   语文  85
2      王三   数学  0缺
1      李四   数学  60补
3      张三   语文  55
2      王三   语文  35作
3      张三   数学  89

把上表交变成下面的表:
学号   姓名   语文  数学
1      李四   85    60补
2      王三   35作  0缺
3      张三   55    89

我已经会整成如下的表:
学号   姓名   语文  数学
1      李四   85    60
2      王三   35    0
3      张三   55    89

但却没有汉字也就成了不是我的要求,我想了一个多月了却没搞出来,我都快急疯了我用的是SQL数据库,用delphi编程链接,请各位高手帮帮忙。天天在等待高手指点。

----------------------------------------------
读好书可以净化心灵,交挚友能够升华人生。山外有山,能人背后自有更强能人在!
作者:
男 cjrb (Thinking In 魂) ★☆☆☆☆ -
盒子活跃会员
2004/2/27 17:38:35
1楼: 增加一标识字段存'补'

效率不好,数据量大的话,查询速度就:(

  declare @sql varchar(8000)
  set @sql='select 学号,姓名,'
  select @sql=@sql+'cast(sum(case 科目 when ''+科目+'' then 成绩 else 0 end) as varchar(10))
     +IsNull((select 标识 from test where 学号=b.学号 and 科目=''+科目+''),'') as  '
    +科目+' ,'  from (select Distinct 科目 from test) as a
  select @sql=left(@sql,len(@sql)-1)+' from test as b group by 学号,姓名'
  exec(@sql)
----------------------------------------------
按此在新窗口浏览图片 充电..........
作者:
男 freewyl (freewyl) ★☆☆☆☆ -
盒子活跃会员
2004/2/27 20:18:07
2楼: 哦,谢谢,我去试试看。

----------------------------------------------
读好书可以净化心灵,交挚友能够升华人生。山外有山,能人背后自有更强能人在!
作者:
男 freewyl (freewyl) ★☆☆☆☆ -
盒子活跃会员
2004/2/28 13:59:46
3楼: 朋友,好像
+IsNull((select 标识 from test where 学号=b.学号 and 科目=''+科目+''),'')

有问题,运行不对,出不来,如果改成单单固定加字倒是可以如:+'作'
就行,可是上面子句的就不行了。
----------------------------------------------
读好书可以净化心灵,交挚友能够升华人生。山外有山,能人背后自有更强能人在!
作者:
男 cjrb (Thinking In 魂) ★☆☆☆☆ -
盒子活跃会员
2004/2/28 23:41:06
4楼:
不会出错啊。就是把科目改成课程.

/*create table 学生成绩表 
  (学号 varchar(10) not null, 姓名 varchar(10) not null,
         课程 varchar(20) not null, 成绩 float,标识 varchar(10))*/
/*
insert into 学生成绩表 values('1','李四','语文',85,')
insert into 学生成绩表 values('2','王三','数学',0,'缺')
insert into 学生成绩表 values('1','李四','数学',60,'补')
insert into 学生成绩表 values('3','张三','语文',55,')
insert into 学生成绩表 values('2','王三','语文',35,'作')
insert into 学生成绩表 values('3','张三','数学',89,')
*/
--select * from 学生成绩表
declare @sql varchar(8000)
  set @sql='select 学号,姓名,'
  select @sql=@sql+'cast(sum(case 课程 when ''+课程+'' then 成绩 else 0 end) as varchar(10))
     +IsNull((select 标识 from 学生成绩表 where 学号=b.学号 and 课程=''+课程+''),'') as  '
    +课程+' ,'  from (select Distinct 课程 from 学生成绩表) as a
  select @sql=left(@sql,len(@sql)-1)+' from 学生成绩表 as b group by 学号,姓名'
  exec(@sql) 
此帖子包含附件:
JPEG 图像
大小:54.8K
----------------------------------------------
按此在新窗口浏览图片 充电..........
作者:
男 freewyl (freewyl) ★☆☆☆☆ -
盒子活跃会员
2004/3/1 17:14:09
5楼: 哦我知道我错在哪里了,
select @sql=left(@sql,len(@sql)-1)+' from 学生成绩表 as b group by 学号,姓名'

我错在上面这句的from前面少了一个空格。非常感谢。

但我还有一个问题就是输入数据那不是课程和标识里都要分别输入才行,
能不能不用加标识这一列也能现实上面的功能呢?
----------------------------------------------
读好书可以净化心灵,交挚友能够升华人生。山外有山,能人背后自有更强能人在!
作者:
男 freewyl (freewyl) ★☆☆☆☆ -
盒子活跃会员
2004/3/1 17:25:21
6楼: 比如说去掉后的汉字,或用空格替换汉字让下面的语句能运行:
sum(case 课程 when ''+课程+'' then 成绩 else 0 end) as varchar(10))

上面能运了,
再想办法加回汉字。

………………共同学习学习………………
----------------------------------------------
读好书可以净化心灵,交挚友能够升华人生。山外有山,能人背后自有更强能人在!
作者:
男 cjrb (Thinking In 魂) ★☆☆☆☆ -
盒子活跃会员
2004/3/1 18:52:35
7楼: 不太清楚你说什么。
分别输入?
标识在录入第个人的成绩时就录入数据库了,同一个操作啊。
----------------------------------------------
按此在新窗口浏览图片 充电..........
作者:
男 freewyl (freewyl) ★☆☆☆☆ -
盒子活跃会员
2004/3/1 21:09:39
8楼: 我的意思是,在成绩的列里,同时录入如:60补,不要标识这一列。
现在的好像只能在成绩列里录入:60,还必须在标识列里录入:补。是不是啊

或者在成绩的列里,同时录入如:60补,让结果在成绩列里有60,在标识列里有补。

但最好还是在成绩的列里,同时录入如:60补,不要标识这一列。
----------------------------------------------
读好书可以净化心灵,交挚友能够升华人生。山外有山,能人背后自有更强能人在!
作者:
男 freewyl (freewyl) ★☆☆☆☆ -
盒子活跃会员
2004/3/1 21:12:46
9楼: 简单一句就是不要增加标识这列能否执行得到,我们加上标识列运行的结果一样。
----------------------------------------------
读好书可以净化心灵,交挚友能够升华人生。山外有山,能人背后自有更强能人在!
作者:
男 cjrb (Thinking In 魂) ★☆☆☆☆ -
盒子活跃会员
2004/3/2 0:16:17
10楼: 1.把sum改成Max
2.将0 改成 '0'
3.把+IsNull((select 标识 from 学生成绩表 where 学号=b.学号 and 课程=''+课程+''),'') 去掉.

declare @sql varchar(8000)
set @sql='select 学号,姓名,'
select @sql=@sql+'cast(Max(case 课程 when ''+课程+'' then 成绩 else  '0' end) as varchar(10))
as  '+课程+' ,'  from (select Distinct 课程 from 学生成绩表) as a
select @sql=left(@sql,len(@sql)-1)+' from 学生成绩表 as b group by 学号,姓名'
  exec(@sql)
----------------------------------------------
按此在新窗口浏览图片 充电..........
作者:
男 freewyl (freewyl) ★☆☆☆☆ -
盒子活跃会员
2004/3/2 9:19:48
11楼: 非常感谢,cjrb兄,不过你认为要标识列和不要标识列的这两种那一种更好,更实用呢?
----------------------------------------------
读好书可以净化心灵,交挚友能够升华人生。山外有山,能人背后自有更强能人在!
作者:
男 freewyl (freewyl) ★☆☆☆☆ -
盒子活跃会员
2004/3/7 15:37:22
12楼: 如何统计交叉以后的表的行和列的计算?cjrb兄和各位大侠再指点,

我想对其进行,行、列的统计却不知道怎么做,才能得如下结果:

姓名   数学   英语   语文    不及格科
李四   30     85     80       1科
王五   45     50     5作      3科
张三   8缺    100    60       1科
合计   3人    1人    1人      5人 

----------------------------------------------
读好书可以净化心灵,交挚友能够升华人生。山外有山,能人背后自有更强能人在!
作者:
男 power_source (power) ★☆☆☆☆ -
盒子活跃会员
2004/5/14 15:05:21
13楼: 在access中怎样实现呀?
----------------------------------------------
我真的不会!
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行78.125毫秒 RSS