以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  请教如何用SQL文句转换表格。  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=17804)

--  作者:lihe60
--  发布时间:2012/3/25 13:54:00
--  请教如何用SQL文句转换表格。
  下贴
[此贴子已经被作者于2012-3-25 15:49:04编辑过]

--  作者:lihe60
--  发布时间: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
--  发布时间: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
--  发布时间: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
--  发布时间: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
--  发布时间: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语句写代码。