ITPUB??ì3
挑战终极任务6人行
ITPUB论坛 » MS SQL Server » 交叉SQL语句不会写,请高人相助

您有 1 条公共消息
  • 来自: 公共消息 标题: 3-5月ITPUB数据库 ... 内容: ITPUB与3月和5月分别安排了Oracle 11g DBA和Oracle性能优化培训,以及 ...

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



    精华贴数 0
    个人空间 0
    技术积分 69 (25588)
    社区积分 1 (42828)
    注册日期 2003-10-24
    论坛徽章:1
    2010新春纪念徽章     
          

    发表于 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 (16253)
    社区积分 0 (88813)
    注册日期 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
    技术积分 69 (25588)
    社区积分 1 (42828)
    注册日期 2003-10-24
    论坛徽章:1
    2010新春纪念徽章     
          

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


    只看该作者    顶部
    离线 ccwlm741212
    老男人


    精华贴数 40
    个人空间 0
    技术积分 35036 (29)
    社区积分 59684 (14)
    注册日期 2002-11-25
    论坛徽章:170
    2010新春纪念徽章2010新春纪念徽章2010新春纪念徽章2010新春纪念徽章2010新春纪念徽章2010新春纪念徽章
    2010新春纪念徽章2010新春纪念徽章2010新春纪念徽章2010新春纪念徽章2010新春纪念徽章2010新春纪念徽章

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


    __________________
    机会是等出来滴.........
    只看该作者    顶部
     
        

    相关内容


    CopyRight 1999-2006 itpub.net All Right Reserved.
    北京皓辰网域网络信息技术有限公司. 版权所有
    E-mail:Webmaster@itpub.net
    网站律师 隐私政策 知识产权声明
    京ICP证:060528号 联系我们