楼主: JESMINE

SQL编辑交叉表

[复制链接]
论坛徽章:
117
ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:322015年新春福章
日期:2015-03-04 14:19:11马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14比亚迪
日期:2013-09-18 09:31:09迷宫蛋
日期:2013-06-05 13:48:452013年新春福章
日期:2013-02-25 14:51:24
11#
发表于 2004-10-18 20:40 | 只看该作者
取月份很简单:
销售地区 销售时间 销售金额
北京 2001-1-1 1000
上海 2001-1-3 200
武汉 2001-1-6 5000
北京 2001-1-9 200
上海 2001-2-1 300
武汉 2001-3-1 600
通过查询
select 销售地区,datepart(month,销售时间) 月份, 销售金额 from 销售
就可以得到上面哪个学生成绩的类似的表了!

使用道具 举报

回复
论坛徽章:
3
会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
12#
发表于 2004-10-19 13:26 | 只看该作者
最初由 cowherd 发布
[B]做好!

IF EXISTS (SELECT name
FROM sysobjects
WHERE name = 'translate_cross'
AND type = 'P')
DROP PROCEDURE translate_cross
GO

create procedure DBO.translate_cross
as
DECLARE @subject varchar(50)
DECLARE aa CURSOR FOR SELECT distinct subject FROM test order by subject
declare @selstr varchar(200)

set @selstr=''

create table #temp
(
rowname varchar(50)
)

OPEN aa

while(1=1)
begin
FETCH NEXT FROM aa INTO @subject
        if @@FETCH_STATUS <> 0 break
        set @selstr=@selstr+'sum(isnull('+@subject+',0)) as '+@subject+','
        execute ('ALTER TABLE #temp ADD '+ @subject + ' decimal(9,2) default 0')
        execute ('insert into #temp(rowname,'+@subject+') select username,result from test where subject='''+@subject+'''')
end
set @selstr=substring(@selstr,1,len(@selstr)-1)

exec ('select rowname ,' +@selstr +' from  #temp group by rowname ')
close aa
DEALLOCATE aa
drop table #temp

结果:
--------------------------------------
rowname      化学      物理
李四        88.00        98.00
王一        80.00        90.00
张三        78.00        89.00
赵六        98.00        73.00 [/B]

版主,这一句:
set @selstr=@selstr+'sum(isnull('+@subject+',0)) as '+@subject+','
好像没有什么用

使用道具 举报

回复
论坛徽章:
0
13#
 楼主| 发表于 2004-10-19 14:03 | 只看该作者
谢谢,我试验了应该算是成功了,但存储过程运行后出现一段提示:“存储过程执行成功但未返回记录”。如何解决。

使用道具 举报

回复
论坛徽章:
0
14#
 楼主| 发表于 2004-10-19 14:32 | 只看该作者
请问一下,下面一段话句是做何用,刚入门学识浅薄,请多指教,谢谢!
IF EXISTS (SELECT name
FROM sysobjects
WHERE name = 'translate_cross'
AND type = 'P')
DROP PROCEDURE translate_cross
GO

使用道具 举报

回复
论坛徽章:
117
ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:322015年新春福章
日期:2015-03-04 14:19:11马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14比亚迪
日期:2013-09-18 09:31:09迷宫蛋
日期:2013-06-05 13:48:452013年新春福章
日期:2013-02-25 14:51:24
15#
发表于 2004-10-19 14:33 | 只看该作者
最初由 weiyatao 发布
[B]
版主,这一句:
set @selstr=@selstr+'sum(isnull('+@subject+',0)) as '+@subject+','
好像没有什么用 [/B]


由于那个临时表的字段名是从原表中读出来的,
那么查询过程中需要使用到的字段必须合并出来。
不这样处理一下的话,出来的结果是:
rowname 化学 物理
李四 88.00 null
王一 80.00 null
张三 78.00 null
赵六 98.00 null
李四 0 98.00
王一 0 90.00
张三 0 89.00
赵六 0 73.00

所以需要

select rowname,sum(isnull(化学,0)) '化学',sum(isnull(物理,0)) '物理'
from #temp group by rowname

才能得到结果!

使用道具 举报

回复
论坛徽章:
117
ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:322015年新春福章
日期:2015-03-04 14:19:11马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14比亚迪
日期:2013-09-18 09:31:09迷宫蛋
日期:2013-06-05 13:48:452013年新春福章
日期:2013-02-25 14:51:24
16#
发表于 2004-10-19 14:34 | 只看该作者
最初由 JESMINE 发布
[B]请问一下,下面一段话句是做何用,刚入门学识浅薄,请多指教,谢谢!
IF EXISTS (SELECT name
FROM sysobjects
WHERE name = 'translate_cross'
AND type = 'P')
DROP PROCEDURE translate_cross
GO [/B]


如果这个存储过程存在,删掉!

使用道具 举报

回复
论坛徽章:
3
会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
17#
发表于 2004-10-20 09:03 | 只看该作者
版主的这个方法真是解决大问题了。
以前都是case或是弄个临时表插来插去,麻烦的很。
现在一看,容易多了,有茅塞顿开之感。
多谢版主!

使用道具 举报

回复
论坛徽章:
117
ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:322015年新春福章
日期:2015-03-04 14:19:11马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14比亚迪
日期:2013-09-18 09:31:09迷宫蛋
日期:2013-06-05 13:48:452013年新春福章
日期:2013-02-25 14:51:24
18#
发表于 2004-10-20 12:54 | 只看该作者
最初由 weiyatao 发布
[B]版主的这个方法真是解决大问题了。
以前都是case或是弄个临时表插来插去,麻烦的很。
现在一看,容易多了,有茅塞顿开之感。
多谢版主! [/B]


你可以尝试一下,把这个写得复杂一点,让存储过程
变得更通用:基本上可能有这些参数:
1:表名对那个表作交叉;
2:行字段名:取该表那一列中的数值作交叉出来的行首值;
3:列字段名:取该表那一列中的数值作交叉出来的列字段;
4:行排序;
5:列排序:

这样就更加通用,不用碰到这种情况再写一次了!

使用道具 举报

回复
论坛徽章:
0
19#
发表于 2004-10-20 13:07 | 只看该作者
select 地區,m,sum(s) FROM (select 地區,month(時間) as m,sum(金額) as s from table group by 地區,時間) a group by 地區,m

使用道具 举报

回复
论坛徽章:
0
20#
发表于 2004-10-20 16:29 | 只看该作者
看得我头发麻

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表