ITPUB论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
更多
查看: 3967|回复: 3

交叉SQL语句不会写,请高人相助 [复制链接]

精华贴数
1
技术积分
202
社区积分
1
注册时间
2003-10-24
论坛徽章:
2
2010新春纪念徽章
日期:2010-01-04 08:33:082011新春纪念徽章
日期:2011-02-18 11:43:35
发表于 2003-11-27 16:38:37 |显示全部楼层
我有如下表:(rep)
结构如下:doc_id:     医师代码
                 xy   :     西药收入
                zcy  :     中成药
                cy   :     草药

select * from rep
显示入下:

doc_id    xy      zcy     cy
00001     1        2       3
00002     4        5       6
00003     7        8       9



我现在需要显示如下格式,请问该怎么写???
doc_id    00001    00002    00003
xy              1         4            7
zcy            2          5            8
cy              3          6            9



即把竖着的要横着显示出来,我知道用sql写交叉语句,可不知道怎么做
拜托高手一定要帮忙啊,小弟急死了............

注册会员

一般会员

精华贴数
0
技术积分
126
社区积分
0
注册时间
2003-1-10
论坛徽章:
0
发表于 2003-11-27 22:10:14 |显示全部楼层
交叉一般来讲是分组统计的一种,形式更复杂,显示更清淅,但数据库本身并没有提供实现交叉表的功能,自己创建交叉表不仅要对过程、游标、临时表、动态SQL等非常熟悉,而且思路也要清淅,本例以PUBS.DBO.SALES表的数据做样本:
CREATE PROCEDURE UP_TEST(
@T1 VARCHAR(30),@T2 VARCHAR(30),
@T3 VARCHAR(30),@T4 VARCHAR(30)) AS
--T1 表名,T2,T3是交叉表的两上分类字段,T4是汇总字段
--T2是行字段,T3列字段
BEGIN
DECLARE @SQL VARCHAR(7999),@FIELD VARCHAR(30)
SELECT @SQL='SELECT DISTINCT '+@T3+' FROM '+@T1
CREATE TABLE #FIELD(FIELD VARCHAR(30))
--将列字段提取到临时表#FIELD中
INSERT INTO #FIELD EXEC(@SQL)
SELECT @SQL='CREATE TABLE CROSS_TEST('+@T2+' VARCHAR(30),'
DECLARE CUR_FIELD CURSOR LOCAL FOR SELECT * FROM #FIELD
OPEN CUR_FIELD
FETCH CUR_FIELD INTO @FIELD
WHILE @@FETCH_STATUS=0 BEGIN
SELECT @FIELD='['+@FIELD+']'
SELECT @SQL=@SQL+@FIELD+' DECIMAL(8,2) DEFAULT 0,'
FETCH CUR_FIELD INTO @FIELD
END
SELECT @SQL=LEFT(@SQL,LEN(@SQL)-1)+')'
--创建临时交叉表CROSS_TEST
EXEC(@SQL)
SELECT @SQL='INSERT INTO CROSS_TEST('+@T2+') SELECT DISTINCT '+@T2+' FROM '+@T1
--将行数据存入交叉表#CROSS_TEST
EXEC(@SQL)
--创建分组数据表TEMP
SELECT @SQL='CREATE TABLE TEMP('+@T2+' VARCHAR(30),'+@T3+' VARCHAR(30),'+@T4+' DECIMAL(8,2))'
EXEC(@SQL)
--将交叉汇总数据放入交叉表
SELECT @SQL='SELECT '+@T2+','+@T3+', SUM(QTY) QTY FROM '+@T1 +' GROUP BY '+@T2+','+@T3
INSERT INTO TEMP EXEC(@SQL)
--将汇总数据写入交叉表
DECLARE CUR_SUM CURSOR LOCAL FOR SELECT * FROM TEMP
DECLARE @F1 VARCHAR(30),@F2 VARCHAR(30),@QTY DECIMAL(8,2),@Q1 VARCHAR(30)
OPEN CUR_SUM
FETCH CUR_SUM INTO @F1,@F2,@QTY
WHILE @@FETCH_STATUS=0 BEGIN
SELECT @F2='['+@F2+']',@Q1=CAST(@QTY AS VARCHAR(30))
SELECT @SQL='UPDATE CROSS_TEST SET '+@F2+'='+@Q1+' WHERE '+@T2+'='''+@F1+''''
EXEC(@SQL)
FETCH CUR_SUM INTO @F1,@F2,@QTY
END
CLOSE CUR_SUM
SELECT * FROM CROSS_TEST
DROP TABLE TEMP
DROP TABLE CROSS_TEST
DROP TABLE #FIELD
END

使用道具 举报

精华贴数
1
技术积分
202
社区积分
1
注册时间
2003-10-24
论坛徽章:
2
2010新春纪念徽章
日期:2010-01-04 08:33:082011新春纪念徽章
日期:2011-02-18 11:43:35
发表于 2003-11-28 09:44:21 |显示全部楼层
谢谢给我提供了一个思路,可这个例子不适合我目前的要求啊!!!
能不能帮我把这段程序写出来啊,我不知道我这样的要求能不能实现!

使用道具 举报

版主

老男人

精华贴数
41
技术积分
38933
社区积分
70804
注册时间
2002-11-25
论坛徽章:
88
NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA之星
日期:2012-01-17 21:22:36NBA大富翁
日期:2008-04-21 22:57:29NBA之星
日期:2012-01-17 21:22:36NBA大富翁
日期:2012-02-08 14:38:28NBA之星
日期:2012-02-08 14:53:55至尊黑钻
日期:2012-01-03 20:25:20紫钻
日期:2012-01-03 20:25:20粉钻
日期:2012-01-03 20:25:20绿钻
日期:2012-01-03 20:25:20黄钻
日期:2012-01-03 20:25:20红钻
日期:2012-01-03 20:25:20
发表于 2003-11-28 10:25:57 |显示全部楼层
看看精华贴

使用道具 举报

相关内容推荐
您需要登录后才可以回帖 登录 | 注册

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 邮箱 虎吧 老博客 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
CopyRight 1999-2011 itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001 广播电视节目制作经营许可证:编号(京)字第1149号
  
回顶部