ITPUB??ì3
12月微软Hyper-V虚拟化沙龙主题征集
ITPUB论坛 » MS SQL Server » 交叉SQL语句不会写,请高人相助

标题: 交叉SQL语句不会写,请高人相助
离线 小馒头
初级会员



精华贴数 0
个人空间 0
技术积分 51 (27751)
社区积分 1 (35149)
注册日期 2003-10-24
论坛徽章:0
      
      

发表于 2003-11-27 16:38 
交叉SQL语句不会写,请高人相助

我有如下表:(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写交叉语句,可不知道怎么做
拜托高手一定要帮忙啊,小弟急死了............


顶部
离线 wuli81
一般会员



精华贴数 0
个人空间 0
技术积分 126 (14051)
社区积分 0 (75655)
注册日期 2003-1-10
论坛徽章:0
      
      

发表于 2003-11-27 22:10 
交叉一般来讲是分组统计的一种,形式更复杂,显示更清淅,但数据库本身并没有提供实现交叉表的功能,自己创建交叉表不仅要对过程、游标、临时表、动态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


顶部
离线 小馒头
初级会员



精华贴数 0
个人空间 0
技术积分 51 (27751)
社区积分 1 (35149)
注册日期 2003-10-24
论坛徽章:0
      
      

发表于 2003-11-28 09:44 
谢谢给我提供了一个思路,可这个例子不适合我目前的要求啊!!!
能不能帮我把这段程序写出来啊,我不知道我这样的要求能不能实现!


顶部
离线 ccwlm741212
老男人


精华贴数 40
个人空间 0
技术积分 31757 (27)
社区积分 54249 (9)
注册日期 2002-11-25
论坛徽章:124
生肖徽章2007版:虎生肖徽章2007版:虎生肖徽章2007版:虎生肖徽章2007版:虎生肖徽章2007版:虎生肖徽章2007版:虎
生肖徽章2007版:虎生肖徽章2007版:虎生肖徽章2007版:虎生肖徽章2007版:虎生肖徽章2007版:虎生肖徽章2007版:虎

发表于 2003-11-28 10:25 
看看精华贴


__________________
参悟佛理~~智慧做人~~谈泊明心~~宽容博大~~除妄去执~~知恩重义


顶部
 
    


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问