sql不行啊,要用一个过程阿.以前csdn上有.

解决方案 »

  1.   

    在sqlserver中我经常写,当是在oracle中还不会用。
      

  2.   

    如果供应商数量不定的话,用sql语句是无法解决的。
    供应商数量有限制的话,可以用decode()来解决。  
     
      

  3.   

    to JeromeLiu(烛光): 谢谢您的参与!你可以给我提个思路呀,重要不是用什么数据库或什么语言而是什么思路!请解释一下“行转列”的问题,好吗?请关注!to bzszp(SongZip): 谢谢您的参与!供应商数量就是供货商表中的货商,即使在价格表中没有它,也显示,我说的数量不定,是说供应商表中的供货商可以会增加。查询供货商表可以得到供货商的数量!请关注,请帮忙忙,感激不尽!
    to  liuyi8903(西西):谢谢您的参与!你好像胸有成竹,能不能说的详细点。列头是所有的供货商,所以我可以通过查询供货商表取得列头,如果只取出某一个供货商的价格很简单,但这里不是要对比显示嘛!能不能说的详细点!拜托您啦!
    to 大家:谢谢大家参与,请大家继续关注!
      

  4.   

    我不知道oracle中的动态sql语句与t-sql是否类似,思路是根据你的数据库中的providerName的名字构造出相应的列,你可以参考一下t-sql的例子,这里是oracle版,请允许我帖个t-sql的“行转列”的典型例子,你可以根据下面的思路试试看:
    /*
    原表:
    name       km         cj          
    ---------- ---------- ----------- 
    张三         语文         80
    张三         数学         86
    张三         英语         75
    李四         语文         78
    李四         数学         85
    李四         英语         78目标表:
    姓名         数学        英语        语文         总分     
    ---------- ---------- ----------- -----------  -----------         
    李四         85          78          78          241
    张三         86          75          80          241
    */create table #test (name varchar(10),km varchar(10),cj int)
    insert #test select '张三','语文',80
    union all select '张三','数学',86
    union all select '张三','英语',75
    union all select '李四','语文',78
    union all select '李四','数学',85
    union all select '李四','英语',78
    go
    select * from #testselect name 姓名,
    sum(case km when '语文' then cj end) 语文,
    sum(case km when '数学' then cj end) 数学,
    sum(case km when '英语' then cj end) 英语,
    sum(cj) 总分
    from #test group by namedeclare @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) a
    set @sql=@sql+',sum(cj) 总分 from #test group by name'
    exec (@sql)
    go
    drop table #test--在sqlserver板块搜索“行转列”或者是“交叉表”会有好多的帖子介绍的。
    在oralce中用decode或是case when。
      

  5.   

    oracle可以实现t-sql中下面的功能吗?如何方便实现?小弟也是初学
    1:
    select @sql = @sql + ',' + col from t
    2:
    t-sql中只要构造初上面的@sql,然后执行动态sql,将其放在一个存储过程里面。就自动返回结果集,很方便,p-sql返回结果集要用游标吧,好像不是很方便。
      

  6.   

    sql语句解决不了。
    --
    请问:如果解决不了,那存储过程返回结果集可以吗?
      

  7.   

    可以用动态sql语句返回结果集
    定义一个包
    ref cursor变量
    在存储过程里面
    根据实际情况组合出sql语句(针对与这个问题,用一个循环语句就行了)然后open cur_name for v_sql; --v_sql存放上面组合的sql语句。
    返回这个游标即可。
      

  8.   

    SELECT T11.ID,T2.price,T11.name,T11.providerName
    FROM (SELECT * FROM goods ,provider Order by goods.id,provider.providerId ) T11,
    price T2
    where T11.id = T2.id(+) AND T11.providerId = T2.provider(+)因为你要先是所有的数据,所以,我就让你的商品和提供商这两个做了FULL JOIN,这样,你要显示的所有的东西,都调出来了,然后,左联结你的价格这个表,这样,有的话,就会,没有的话,就是NULL,你可以控制显示的。这样,就和你得显示方法有关系了,你可以用一个变量,来记录你的物品序号,不同的时候,就是换行。否则,就是rs.next();还有一个问题,就是,你的供货商名称名字的取得,其实,这个就见仁见智了。
    1。可以再取一次。只是取供货商表
    2。读取晚所有的第一条数据以后,也可以知道。
    3。在你的物品表里面添加id是0的数据,它的目的就是取得供货商名称上面的方法3,假如你不想添加,可以用下面的SQL句子。
    select 0,0,T11.name,T11.providerName
    FROM (SELECT * FROM goods ,provider Order by goods.id,provider.providerId ) T11
    UNION
    SELECT T11.ID,T2.price,T11.name,T11.providerName
    FROM (SELECT * FROM goods ,provider Order by goods.id,provider.providerId ) T11,
    price T2
    where T11.id = T2.id(+) AND T11.providerId = T2.provider(+)假如还有什么问题,可以和我联系。和和。
      

  9.   

    http://community.csdn.net/Expert/topic/3093/3093861.xml?temp=.5416529
    http://community.csdn.net/Expert/topic/2769/2769512.xml?temp=.780163
      

  10.   

    to bzszp(SongZip): 不一定非要用SQL语句来解决呀,如果用存储过程请提供思路,谢谢!请关注!
      

  11.   

    bzszp(SongZip) ( ) 不要误导别人。
      

  12.   

    我上面的两个地址有类似的情况。
    1、构造变量sql语句
    2、存储过程定义游标返回sql语句的结果集
      

  13.   

    不定个数列的横向排列,sql不能完成,只能写过程,楼主需要多看看以前的帖子!
      

  14.   

    最终修改的SQL句子,取了所有的东西,也排好了序列(上面的句子,有序列的问题。)。SELECT 0 AS ID,providerId,0 AS price,'' AS name,providerName
    FROM provider
    UNION
    SELECT T11.ID,T11.providerId ,T2.price,T11.name,T11.providerName
    FROM (SELECT * FROM goods ,provider Order by goods.id,provider.providerId ) T11,
    price T2
    where T11.id = T2.id(+) AND T11.providerId = T2.provider(+)他的这个情况是可以解决的,不一定需要做过程。楼上的人,不要去误导别人。
      

  15.   

    最终修改的SQL句子,取了所有的东西,也排好了序列(上面的句子,有序列的问题。)。SELECT 0 AS ID,providerId,0 AS price,'' AS name,providerName
    FROM provider
    UNION
    SELECT T11.ID,T11.providerId ,T2.price,T11.name,T11.providerName
    FROM (SELECT * FROM goods ,provider Order by goods.id,provider.providerId ) T11,
    price T2
    where T11.id = T2.id(+) AND T11.providerId = T2.provider(+)他的这个情况是可以解决的,不一定需要做过程。楼上的人,不要去误导别人。
    --
    你这个结果不正确,返回的是5列,楼主的列数是不定的。这个需要用过程,即使过程,写起来也不是很容易,建议楼主先熟悉最简单的单表的行列转换,成功了后再修改成为你的三个表的。
      

  16.   

    SELECT 0 AS ID,providerId,0 AS price,'' AS name,providerName
    FROM provider
    UNION
    SELECT T11.ID,T11.providerId ,T2.price,T11.name,T11.providerName
    FROM (SELECT * FROM goods ,provider Order by goods.id,provider.providerId ) T11,
    price T2
    where T11.id = T2.id(+) AND T11.providerId = T2.provider(+);执行结果:
            ID PROVIDERID      PRICE NAME               PROVIDERNAME
    ---------- ---------- ---------- ------------------ --------------------
             0 a                   0                    北京供货商
             0 b                   0                    上海供货商
             0 c                   0                    南京供货商
             1 a                 100 西门子M55          北京供货商
             1 b                 120 西门子M55          上海供货商
             1 c                     西门子M55          南京供货商
             2 a                 150 诺基亚3100         北京供货商
             2 b                 110 诺基亚3100         上海供货商
             2 c                     诺基亚3100         南京供货商已选择9行。
      

  17.   

    不好意思,可能得罪了某些人,其实,我想表达的意思很简单,这个问题,就可以用SQL来解决。所以,我对那些说了,SQL不能解决的人,做出了一些回答。不好意思。
     JeromeLiu(烛光):
    你根本就没有仔细看过我写的东西,假如你认真看了,或者,分析过,我想,你就不会这么回答我了。 bzszp(SongZip) 
    可能我的表达方式不对,我只是想说,这个可以通过SQL句子来解决。假如有什么冒犯的话,我只有说一句,对不起了。
      

  18.   

    楼主,我想知道,我写的东西,你明白了吗?对你有帮助吗?我看过CSDN里面的人的一些做法,我只是给你换一个思路。很多的时候,问题的解决方法不是一个,条条大路通罗马。
      

  19.   

    请问:Croatia(Croatia) 
    能不能借鉴一下Croatia(Croatia) 他们的思路直接实现如楼主
    -------------------------------------------------------------------
    商品序号 |  商品名称  | 北京供货商  | 上海供货商 | 南京供货商……
    -------------------------------------------------------------------
    1       西门子M55         100                 120     无
    2              诺基亚3100         150                 110     无 
    ……
    这样的查询结果!这样是不更好一点,是不是就可以在页面上不必要判断,以及换行的什么的,我很菜,以上意见,请各们高手想想!我也将密切关注!
      

  20.   

    TO: lotusfromwater(出水芙蓉) 其实,转换放在什么地方,这个问题,我看需要再看待了,他们写在ORACLE的过程里面,我只不过是写在了JSP或者JAVA里面。我喜欢把这样的简单的显示逻辑,做到后者里面。看你喜欢了。
      

  21.   

    楼主,我想知道,我写的东西,你明白了吗?对你有帮助吗?我看过CSDN里面的人的一些做法,我只是给你换一个思路。很多的时候,问题的解决方法不是一个,条条大路通罗马。to  Croatia(Croatia):谢谢,有帮助,是这样的,我实现的问题比提出来的要复杂许多,我提问习惯把实际的问题简单化,以便大家在更短的时间内知道我想问什么……我现在正在整理您的方法,以及大家提供的思路……看看用什么方法更适合于这个复杂的问题。
      

  22.   

    JeromeLiu(烛光):
    你根本就没有仔细看过我写的东西,假如你认真看了,或者,分析过,我想,你就不会这么回答我了。
    --
    是的,我没有仔细看过,我只是针对楼主的查询结果,而不是说在前台程序中处理,所有很抱歉。
      

  23.   

    看看这位高手beckhambobo(beckham) 在别的帖子的回复,希望对你有帮助,我也继续关注: 
     
       
    SQL*PLus> desc emp;
     名称                                      是否为空? 类型
     ----------------------------------------- -------- -----------------------
     EMPNO                                              NUMBER(4)
     ENAME                                              VARCHAR2(10)
     JOB                                                VARCHAR2(9)
     MGR                                                NUMBER(4)
     HIREDATE                                           DATE
     SAL                                                NUMBER(7,2)
     COMM                                               NUMBER(7,2)
     DEPTNO                                             NUMBER(2)SQL*PLus> select job, deptno, count(*)
      2       from emp
      3       group by job, deptno;JOB           DEPTNO   COUNT(*)
    --------- ---------- ----------
    CLERK             10          2
    CLERK             20          4
    CLERK             30          2
    ANALYST           20          4
    MANAGER           10          2
    MANAGER           20          2
    MANAGER           30          2
    SALESMAN          30          8
    PRESIDENT         10          2已选择9行。SQL*PLus> select job,
      2          max( decode( deptno, 10, cnt, null ) ) dept_10,
      3          max( decode( deptno, 20, cnt, null ) ) dept_20,
      4          max( decode( deptno, 30, cnt, null ) ) dept_30,
      5          max( decode( deptno, 40, cnt, null ) ) dept_40
      6        from ( select job, deptno, count(*) cnt
      7               from emp
      8               group by job, deptno )
      9      group by job
     10     /JOB          DEPT_10    DEPT_20    DEPT_30    DEPT_40
    --------- ---------- ---------- ---------- ----------
    ANALYST                       4
    CLERK              2          4          2
    MANAGER            2          2          2
    PRESIDENT          2
    SALESMAN                                 8-----------------------------------------------------------------------------------
    各位,我有如下一个工资表,如:
       姓名  工资项   工资
       张三  基本工资  1000
       张三  岗位工资  2000
       张三  效益工资   200
       李四  基本工资  1000
       李四  效益工资  1000
       .......我需要用一个SQL语句得到如下所示的结果:
       姓名  基本工资  岗位工资  效益工资 .....
       张三  1000      2000       200     .....
       李四  1000         0      1000     .....
       ....
    select 姓名, sum(decode(工资项,'基本工资',工资,0)) 基本工资, 
      sum(decode(工资项,'岗位工资',工资,0)) 岗位工资, ....
    from yourtable
    group by 姓名
      
     
      

  24.   

    楼上的,他这么些,因为,他的部分code,已经定死了,所以才用decode,这个意见,上面已经有人说过了。
      

  25.   

    我给你提供一个例子.方法不太好.但是还管用.
    第一个存储过程是用来获取表头的.第二个是获取表内容的.也就是数据.
    两个过程都是返回sql
    create or replace procedure p_dtsgdttj_getsql_top(as_date1 in varchar2,as_date2 in varchar2, as_resql out long,as_count out integer) is
    /*
      存储过程功能描述:
                       获得事故复杂动态表头
    --自返回参数:as_resql   varchar
    --按照所提供的参数信息获取构造的SQL语句
    --参数:as_date1    开始时间
    --     as_date2    结束时间
    */
    type v_cursor is ref cursor;
         mycursor v_cursor;      --声明游标变量(获得所有的区域编码)
         v_code long;   --区域编码集合
         v_temp long;   --临时
         v_temp1 long;   --临时
         v_temp2 long;   --临时
         v_temp3 long;   --临时
         v_sql long;   --合计的最终sql
         v_code1 varchar2(30);
         v_name varchar2(100);
         v_num  number(10);
         v_code2 varchar2(20);
         v_code3 varchar2(20);
    begin
         v_temp1 :=' ';
         v_temp3 :=' ';
         v_num :=0;
         v_code :='select ''井号'' as wellno,''钻机编号'' as zuanj,''公司'' as gsname,''区域'' as qymc,''区块'' as qkmc,''井别'' as jbmc,''设计井深(米)'' as shejjs,''实际井深(米)'' as shijjs,''损失金额(元)'' as lossmoney,''损失进尺(米)'' as lossjc,''事故次数'' as accidentcount ';
         open mycursor for select distinct sglbbm,f_db_get_jcbmname(sglbbm) from p_sgfzcl where  sgsj >= to_date(as_date1,'yyyy-mm-dd') and sgsj <= to_date(as_date2,'yyyy-mm-dd') ;
             loop
            fetch mycursor into v_code1,v_name ;
            exit when mycursor%NOTFOUND;
             v_num := v_num + 1;
             v_code2 :='sgcs'||trim(to_char(v_num,'0000'));
             v_code3 :='sgsj'||trim(to_char(v_num,'0000'));
             if v_code1 is null then
              v_code1 :=' ' ;
              v_name :='未命名';
            end if;
            v_temp1 :=v_temp1||','''||v_name||'''  as '||v_code2;
            v_temp3 :=v_temp3||','''||v_name||'''  as '||v_code3;
            end loop;
            v_temp2 :=',''损失时间'' as losstime';
            v_temp := v_temp1||v_temp2||v_temp3;
            v_code := v_code||v_temp;
        v_sql := v_code||' from c_well a where rownum=1';
        close mycursor;
        as_resql :=v_sql;
        as_count := 12 + 2*v_num;
     EXCEPTION
     WHEN OTHERS THEN
      as_resql :='null'; --异常处理信息
      as_count := 12 ;
    end p_dtsgdttj_getsql_top;create or replace procedure p_dtsgdttj_getsql(as_date1 in varchar2,as_date2 in varchar2, as_resql out long) is
    /*
      存储过程功能描述:
                       获得事故复杂动态表体
    --自返回参数:as_resql   varchar
    --按照所提供的参数信息获取构造的SQL语句
    --参数:as_date1    开始时间
    --     as_date2    结束时间
    */
    type v_cursor is ref cursor;
         mycursor v_cursor;      --声明游标变量(获得所有的区域编码)
         v_code long;   --区域编码集合
         v_temp long;   --临时
         v_temp1 long;   --临时
         v_temp2 long;   --临时
         v_temp3 long;   --临时
         v_temp4 long;   --临时
         v_sql long;   --合计的最终sql
         v_val integer;      --某一月份的天数
         v_code1 varchar2(30);
         v_name varchar2(100);
    begin
         v_temp1 :=' ';
         v_temp3 :=' ';
         v_code :='select distinct a.wellname as wellname,a.WELLTEAMNO as zuanj,f_getcomname(a.comname) as gsname,f_db_get_jcbmname(a.qy) as qymc,f_db_get_jcbmname(a.qk) as qkmc,f_db_get_jcbmname(a.jb) as jbmc,a.designdeep as shejjs,a.completedeep as shijjs,f_dongt_sumsgtj(a.wellno,'''||as_date1||''', '''||as_date2||''' ,5,1) as lossmoney,f_dongt_sumsgtj(a.wellno,'''||as_date1||''', '''||as_date2||''' , 5,2) as lossjc,f_dongt_sumsgtj(a.wellno,'''||as_date1||''', '''||as_date2||''' , 5,3) as accidentcount ';
         open mycursor for  select distinct sglbbm,f_db_get_jcbmname(sglbbm) from p_sgfzcl where  sgsj >= to_date(as_date1,'yyyy-mm-dd') and sgsj <= to_date(as_date2,'yyyy-mm-dd') ;
             loop
            fetch mycursor into v_code1,v_name ;
            exit when mycursor%NOTFOUND;
             if v_code1 is null then
              v_code1 :=' ' ;
              v_name :='未命名';
            end if;
            v_temp1 :=v_temp1||', f_dongt_xxsgtj(a.wellno,'''||as_date1||''', '''||as_date2||''','''||v_code1||''',5,1) as '||v_name;
            v_temp3 :=v_temp3||', f_dongt_xxsgtj(a.wellno,'''||as_date1||''', '''||as_date2||''','''||v_code1||''',5,2) as '||v_name;
            end loop;
            v_temp2 :=',f_dongt_sumsgtj(a.wellno,'''||as_date1||''', '''||as_date2||''' ,5,4) as losstime';
            v_temp := v_temp1||v_temp2||v_temp3;
            v_code := v_code||v_temp;
        v_sql := v_code||' from c_well a,p_sgfzcl p where p.wellno=a.wellno and sgsj >= to_date('''||as_date1||''','''||'yyyy-mm-dd'') and sgsj <= to_date('''||as_date2||''','''||'yyyy-mm-dd'||''')';
        close mycursor;
        as_resql :=v_sql;
     EXCEPTION
     WHEN OTHERS THEN
      as_resql :='null'; --异常处理信息
    end p_dtsgdttj_getsql;
      

  26.   

    TO liuyi8903(西西) :虽然看不懂,但依然十分感谢!
      

  27.   

    本人本着来者有分的原则进行结贴,根据功劳苦劳兼顾热心程度给分,最终采用的是Croatia(Croatia) 的思路对实际的问题(自然比我提问的问题要复杂许多倍的),本想给Croatia(Croatia) 101分,但帖子无法加分,所以我会另开贴给他分的!对于其他朋友给我的帮助我表示感谢!谢谢大家了!分数不一定让人人满意,但我想分数不是很重要吧!再一次表示感谢!Croatia(Croatia)领分地址:http://community.csdn.net/Expert/topic/3446/3446949.xml?temp=.3111383