SQL 应用(交叉表,行转列)。。。。

ggygd 2008-01-21 11:27:07
create table hzl (name char(10),km char(10),cj int)
go
insert hzl values('张三','语文',80)
insert hzl values('张三','数学',86)
insert hzl values('张三','英语',75)
insert hzl values('李四','语文',78)
insert hzl values('李四','数学',85)
insert hzl values('李四','英语',78)
create table tb (name char(10),jg int)
go
insert tb values('语文',70)
insert tb values('数学',86)
insert tb values('英语',75)
.....
要实现
name km cj jg km cj jg... 是否通过
张三' '语文' 80 70 英语 75 75 .. 是
......

註:只要一课没有成绩或是不及格就算不通过。

这么晚还发帖,想多征求些思路,谢谢!
...全文
716 点赞 收藏 52
写回复
52 条回复
切换为时间正序
请发表友善的回复…
发表回复
lgxysl 2008-01-22
等我看看
列转行是容易的
关健是识别是否通过
看来得分三步走:
1、用一个视图进行列转行(容易)
2、用两个视图识别是否通过
(1)用一个视图把通过的输出,不通过的输出1
(2)用一个视图进行sum统计,结果为1的为不通过,o的为通过

3、上述两个视图连接成输出视图(容易)

只给出思路,代码没有空写。可以负责任地告诉你,上述方法一定行!

-------------------------------------------------------------------------------------
欢迎光临LGX软件园(http://lgxyslldw.512j.com)

◎LgxGrid表格(报表)控件。无论你是初学者还是资深程序员,她都会给你带来意想不到的惊喜!

lgxgrid控件有什么特色:
1、完美的打印功能。她可以让你轻松在WEB应用或windows应用中打印复杂的报表。
2、方便与XML Web Services交换数据。她可以与XML Web Services无刷新交换数据,让你
的WEB应用获得像windows应用一样的效果。
3、方便与数据库交换数据,可以用SQL查询直接获得数据库中的数据。
4、完善的格式设置功能,可以让你设计无论是表头还是表体都十分复杂的表格或报表。
5、完善的读写控制,你可以把只读还是可读写设置到每一个单元格。

◎Lgx函数字符串表达式解析控件。字符串表达式解析,原来是如此简单!

Lgx函数字符串表达式解析控件有什么特色: 支持外接函数的解析,外接函数不受编程语
言及控件本身的限制,你可以任意编写外接函数。


◎LGX网店管理系统。多用户多网店系统,她,让你可以轻轻松松地组建你的网店,让互联网给你带来无限的商机。

(以上三款软件诚招软件销售代理商。有意者邮lgxysl@163.com商谈)
回复
njdtk 2008-01-22
什么意思?
不明白。
回复
njdtk 2008-01-22
这是什么数据库?
每个数据可都有自己的方言 的
回复
ggygd 2008-01-22
谢谢各位,结果已经可以达到需求啦!今晚结贴!
回复
ggygd 2008-01-22
to:
pt1314917 ()
还是有点差异。呵呵。

create table hzl (name char(10),km char(10),cj int)
go
insert hzl values('张三','语文',80)
insert hzl values('李四','语文',78)
insert hzl values('王五','英语',78)

create table tb (name char(10),jg int)
go
insert tb values('语文',70)
insert tb values('数学',86)
insert tb values('英语',75)

结果:
name km cj jg km cj jg km cj jg .. 是否通过
张三 语文 80 70 英语 0 75 数学 0 86 .. 否
李四 语文 78 70 英语 0 75 数学 0 86 .. 否
张三 语文 0 70 英语 78 75 数学 0 86 .. 否



......
回复
yt_spring 2008-01-22
处理过程又整理了一下,请多提宝贵意见

declare @s varchar(8000)
set @s = 'select a.name'
select @s = @s +',[' + km + ']=max(case when km = '''+km+''' then km else null end),
[' + km + ']=max(case when km = '''+km+''' then cj else null end),
[及格分数]=max(case when km = '''+km+''' then jg else null end)'
from (select distinct km from hzl) a
set @s=@s + ',[是否通过]=(case when exists(select * from hzl p1,tb p2 where p1.km=p2.name and p1.cj<p2.jg and p1.name=a.name) then ''是'' else ''否'' end)'
exec (@s+ ' from hzl a left join tb b on a.km = b.name group by a.name;')
print @s+ ' from hzl a left join tb b on a.km = b.name group by a.name'
回复
nettman 2008-01-22
Mark!
回复
JiangHongTao 2008-01-22
name km cj jg km cj jg km cj jg 是否通过
---------- ---------- ----------- ----------- ---------- ----------- ----------- ---------- ----------- ----------- ----
李四 数学 85 86 英语 78 75 语文 78 70 否
张三 数学 86 86 英语 75 75 0 0 否

回复
JiangHongTao 2008-01-22
前面的没有对缺科的进行判断,修改如下:

create       table       hzl       (name       char(10),km       varchar(10),cj       int)       
go
-- insert hzl values('张三','语文',80)
insert hzl values('张三','数学',86)
insert hzl values('张三','英语',75)
insert hzl values('李四','语文',78)
insert hzl values('李四','数学',85)
insert hzl values('李四','英语',78)
create table tb (name char(10),jg int)
go
insert tb values('语文',70)
insert tb values('数学',86)
insert tb values('英语',75)

declare @s varchar(8000)
set @s = 'select a.name'
select @s = @s +',[km]=max(case when km = '''+km+''' then km else '''' end),
[cj]=max(case when km = '''+km+''' then cj else 0 end),
[jg]=max(case when km = '''+km+''' then jg else 0 end) '
from (select distinct km from hzl) a
exec( @s+ ',
[是否通过] =case when exists(select 1 from hzl c,tb d
where c.km = d.name and a.name = c.name and c.cj < d.jg)
or exists(select 1 from tb where name not in (select km from hzl where name = a.name))
then ''否'' else ''是'' end
from hzl a left join tb b on a.km = b.name group by a.name')
drop table hzl,tb
回复
-狙击手- 2008-01-22
真可爱,
2007可爱中国奖 就是你了(央视有感动中国,CSDN有可爱中国)
回复
yiyi_wx 2008-01-22
吼吼吼~~~
回复
-狙击手- 2008-01-22
yiyi_wx
ˇ依依 ㄣ
等 级:
发表于:2008-01-22 21:46:4844楼 得分:0
how are you ?
你怎麽这样啊?
----------------

how old are you ?

你怎麽老这样啊?



====================

你答得了,依依真聪明
回复
yiyi_wx 2008-01-22
how are you ?
你怎麽这样啊?
----------------

how old are you ?

你怎麽老这样啊?
回复
pt1314917 2008-01-22
热烈欢迎背着马桶散步继续散分批评我.
------------------------------
对老乌龟无语了。竟然还有人讨着挨批的。。。牛人````
乌龟啊。要不这样?
转点分,让我批批你吧?
回复
pt1314917 2008-01-22

试试我这个:

declare @sql varchar(8000)
set @sql='select a.name'
select @sql=@sql+',[km]='''+rtrim(name)+''',
[cj]=max(case when km = '''+rtrim(name)+''' then cj else 0 end),[jg]='+cast(jg as varchar) from tb
set @sql=@sql+',[是否通过] =case when exists(select 1 from hzl c,tb d
where c.km = d.name and a.name = c.name and c.cj < d.jg)
then ''否'' else ''是'' end from hzl a left join tb b on a.km=b.name group by a.name'
exec(@sql)
回复
-狙击手- 2008-01-22
pt1314917
背着灵魂漫步
等 级:
发表于:2008-01-22 21:07:4640楼 得分:0
今天在公交上看一个动视笑话

how old are you ?

解释为:你怎么老这样呀?

你再汗一个
---------------------
。。。。。。。。。
很好很强大 !




------------------------------------------------------------------

漫步 ,how are you ?
何解
回复
dawugui 2008-01-22
热烈欢迎背着马桶散步继续散分批评我.
回复
yiyi_wx 2008-01-22
看来昨天对老乌龟的通报批评还不够深刻啊。。。

==================================

那就接着散分批评~
回复
wzy_love_sly 2008-01-22
很暴力..
回复
pt1314917 2008-01-22
看来昨天对老乌龟的通报批评还不够深刻啊。。。
回复
发动态
发帖子
应用实例
创建于2007-09-28

2.7w+

社区成员

MS-SQL Server 应用实例
申请成为版主
社区公告
暂无公告