Foxtable(狐表)用户栏目专家坐堂 → 请教如何用SQL文句转换表格。


  共有10833人关注过本帖树形打印复制链接

主题:请教如何用SQL文句转换表格。

帅哥哟,离线,有人找我吗?
lihe60
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:6887 积分:43621 威望:0 精华:0 注册:2009/3/2 14:07:00
请教如何用SQL文句转换表格。  发帖心情 Post By:2012/3/25 13:54:00 [只看该作者]

  下贴
[此贴子已经被作者于2012-3-25 15:49:04编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
lihe60
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:6887 积分:43621 威望:0 精华:0 注册:2009/3/2 14:07:00
  发帖心情 Post By:2012/3/25 15:22:00 [只看该作者]

eg1:
Create table test (name char(10),km char(10),cj int)
go
insert test values('张三','语文',80)
insert test values('张三','数学',86)
insert test values('张三','英语',75)
insert test values('李四','语文',78)
insert test values('李四','数学',85)
insert test values('李四','英语',78)

想变成

姓名      语文      数学      英语 合计
张三      80        86          75      241
李四      78        85          78      241


declare @sql varchar(8000)
set @sql = 'select name'
select @sql = @sql + ',sum(case km when '''+km+''' then cj end) ['+km+']'
from (select distinct km from test) as a
select @sql = @sql+' from test group by name'
exec(@sql)

drop table test

 

这段代码如何转换成狐表可执行的SQL语句?

[此贴子已经被作者于2012-3-25 16:23:44编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
admczy
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:11 积分:172 威望:0 精华:0 注册:2010/6/9 9:44:00
  发帖心情 Post By:2012/3/25 16:00:00 [只看该作者]

if not object_id('stuid') is null
    drop table stuid
Go
Create table stuid([学号] varchar(20),[科目] nvarchar(2),[成绩] int)
Insert stuid
select N'0101',N'语文',75 union all
select N'0102',N'语文',70 union all
select N'0103',N'语文',90 union all
select N'0101',N'数学',89 union all
select N'0102',N'数学',80 union all
select N'0103',N'数学',99 union all
select N'0101',N'英语',89 union all
select N'0102',N'英语',79 union all
select N'0103',N'英语',67
Go


select
    学号,
    语文= sum(case when 科目='语文' then 成绩 else 0 end),
    数学=sum(case when 科目='数学' then 成绩 else 0 end),
    英语=sum(case when 科目='英语' then 成绩 else 0 end),
    SUM(成绩) 总成绩  
from   stuid
group by 学号

学号 语文 数学 英语 总成绩
0101 75 89 89 253
0102 70 80 79 229
0103 90 99 67 256

 

declare @s nvarchar(4000)
Select  @s=isnull(@s+',','')+quotename([科目]) from stuid group by [科目]
exec('select [学号],'+@s+',[总成绩] from (select *,[总成绩]=sum([成绩])over(partition by [学号]) from stuid ) a
pivot (max([成绩]) for [科目] in('+@s+'))b ')

 

学号 数学 英语 语文 总成绩
0102 80 79 70 229
0101 89 89 75 253
0103 99 67 90 256

 


 


 回到顶部
帅哥哟,离线,有人找我吗?
lihe60
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:6887 积分:43621 威望:0 精华:0 注册:2009/3/2 14:07:00
  发帖心情 Post By:2012/3/25 16:05:00 [只看该作者]

以下是引用admczy在2012-3-25 16:00:00的发言:

if not object_id('stuid') is null
    drop table stuid
Go
Create table stuid([学号] varchar(20),[科目] nvarchar(2),[成绩] int)
Insert stuid
select N'0101',N'语文',75 union all
select N'0102',N'语文',70 union all
select N'0103',N'语文',90 union all
select N'0101',N'数学',89 union all
select N'0102',N'数学',80 union all
select N'0103',N'数学',99 union all
select N'0101',N'英语',89 union all
select N'0102',N'英语',79 union all
select N'0103',N'英语',67
Go


select
    学号,
    语文= sum(case when 科目='语文' then 成绩 else 0 end),
    数学=sum(case when 科目='数学' then 成绩 else 0 end),
    英语=sum(case when 科目='英语' then 成绩 else 0 end),
    SUM(成绩) 总成绩  
from   stuid
group by 学号

学号 语文 数学 英语 总成绩
0101 75 89 89 253
0102 70 80 79 229
0103 90 99 67 256

 

declare @s nvarchar(4000)
Select  @s=isnull(@s+',','')+quotename([科目]) from stuid group by [科目]
exec('select [学号],'+@s+',[总成绩] from (select *,[总成绩]=sum([成绩])over(partition by [学号]) from stuid ) a
pivot (max([成绩]) for [科目] in('+@s+'))b ')

 

学号 数学 英语 语文 总成绩
0102 80 79 70 229
0101 89 89 75 253
0103 99 67 90 256

 


 

谢谢,但我的问题还是没有解决:第一个回答不能使用枚举法,因为事先不知有哪些科目;第二个回答不能在狐表中执行。

[此贴子已经被作者于2012-3-25 16:12:17编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
admczy
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:11 积分:172 威望:0 精华:0 注册:2010/6/9 9:44:00
  发帖心情 Post By:2012/3/25 16:15:00 [只看该作者]

可以直接用交叉汇总,然后把总成绩做成表达式列.

Dim g As New CrossTableBuilder("统计表1", DataTables("stuid"))
g.HGroups.AddDef("学号")
g.VGroups.AddDef("科目")
g.Totals.AddDef("成绩", "成绩")
g.Build()
MainTable = Tables("统计表1")


 回到顶部
帅哥哟,离线,有人找我吗?
lihe60
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:6887 积分:43621 威望:0 精华:0 注册:2009/3/2 14:07:00
  发帖心情 Post By:2012/3/25 16:23:00 [只看该作者]

以下是引用admczy在2012-3-25 16:15:00的发言:

可以直接用交叉汇总,然后把总成绩做成表达式列.

Dim g As New CrossTableBuilder("统计表1", DataTables("stuid"))
g.HGroups.AddDef("学号")
g.VGroups.AddDef("科目")
g.Totals.AddDef("成绩", "成绩")
g.Build()
MainTable = Tables("统计表1")

这个我知道,我想用SQL语句写代码。


 回到顶部