以文本方式查看主题
- Foxtable(狐表) (http://foxtable.com/bbs/index.asp)
-- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2)
---- 请教如何用SQL文句转换表格。 (http://foxtable.com/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语句写代码。
|