有一个表sale
select product_name, city, sum(product_number) num
     from sale
    group by product_name, city 
之后出现的结果为
    PRODUCT_NAME CITY NUM
1 地瓜              烟台    602354
2        面粉              德州    1102445
3        橘子              兰州    342681
4        大米              菏泽    1144123
5        土豆              济宁    952562  select '地瓜','大米', min(a)
  from (select '地瓜' b, sum(product_number) a
          from sale
         WHERE TO_CHAR(SALE_DATE, 'yyyy-mm-dd') LIKE '%2005%'
           AND PRODUCT_NAME = '地瓜'
        
        union
        
        select '大米' b, sum(product_number) a
          from sale
         WHERE TO_CHAR(SALE_DATE, 'yyyy-mm-dd') LIKE '%2005%'
           AND PRODUCT_NAME = '大米'
        
        )
得到结果为
地瓜  大米  197691现在需求的是将5种产品排列组合出  以及求 两者之间sum(product_number)较小值显示,应该就是上面的15行类似的
怎么写这个程序呢select a.product_name, b.product_name
  from (select product_name, sum(product_number) num
          from sale
         group by product_name) a,
       (select product_name, sum(product_number) num
          from sale
         group by product_name) b
我这个样写只是把2个表2列交叉了,还要写个取sum(product_number)较小值的函数进去,另外还要把重复的删掉,
 where a.product_name != b.product_name   
这个样只能把大米 —大米这样的删除了,删除不了大米-面粉,面粉-大米这种

解决方案 »

  1.   

    SELECT SUM(PRODUCT_NAME)PRODUCT_NAME FROM 
    (SELECT TOP 2 PRODUCT_NAME FROM TB ORDER BY NUM ) AS T
    你的意思应该就是取两个最小的NUM再加起来就是了
      

  2.   

    是不是这样?
    select top 1 PRODUCT_NAME b, sum(product_number) a 
              from sale 
            WHERE SALE_DATE >='2005-01-01'  //注意这个效率比你的要高很多
    group by PRODUCT_NAME 
    order by sum(product_number)
            
      

  3.   

    求和的问题解决了,直接写了个CASE就行了, 现在要求的是过滤我这个样写只是把2个表2列交叉了,还要写个取sum(product_number)较小值的函数进去,另外还要把重复的删掉, 
    where a.product_name != b.product_name  
    这个样只能把大米 —大米这样的删除了,删除不了大米-面粉,面粉-大米这种得到结果为 
    地瓜  大米  197691 ---楼上的,我这样描述的不够清晰么,我要把     大米 大米 8123478(乱输的)      这种删除
    把      大米-面粉,面粉-大米      这种就保留一个,清晰了吧,ORACLE没个自带的这种函数么此乃我毕业设计,要的不是效率,我差点没忍住写个死循环卡死给我毕业设计老师。仍然感谢3楼,我再去看下,争取提高下效率
      

  4.   

    算了..找到个个ORACLE自带的东西,搞定了
    insert into C_2
      (PRODUCT_NAME1, PRODUCT_NAME2, SUPPORT)
      
      (select a.product_name a,
             b.product_name b,
             (case
               when c - d < 0 then
                c
               else
                d
             end) c
        from (select product_name, sum(product_number) c
                from sale
               group by product_name) a,
             (select product_name, sum(product_number) d
                from sale
               group by product_name) b
       where a.product_name != b.product_name
         and a.product_name || b.product_name in
             (
              
              select replace(sys_connect_by_path(rn, '^#^'), '^#^', '')
                from (select product_name as rn, num
                         from (select product_name, sum(product_number) num
                                 from sale
                                group by product_name))
               where level = 2
              connect by rn > prior rn
              
              )
              );
    后半部分过滤用例如同时存在ab,与ba,会删减掉一个..楼上那么多要表结构的..我一共就用那个product_name(产品名)跟product_number(产品数量)抽象么?我不是还举了下我GROUP BY出来的数据么,还有更简单的方法的么,有的话说一下,我改改
      

  5.   

    1、建议楼主列出数据,以及要的结果(正确的,而不是随手敲的)
    2、考虑下cross join方式
    select *,case when s.num<t.num  then s.num else t.num end
    from tc s  cross join tc t
    where s.PRODUCT_NAME<>t.PRODUCT_NAME
      

  6.   

    要提供效率的话, 
    1. 首先要把这个条件写法改改, 因为在where条件的等式左边用函数转换实在太慢了
    TO_CHAR(SALE_DATE, 'yyyy-mm-dd') LIKE '%2005%' 
    修改成 
    SALE_DATE >= '2005-01-01' and SALE_DATE < '2006-01-01'2. 创建索引, 例如创建, SALE_DATE, PRODUCT_NAME的组合索引
      

  7.   

    要提供效率的话, 
    1. 首先要把这个条件写法改改, 因为在where条件的等式左边用函数转换实在太慢了 
    TO_CHAR(SALE_DATE, 'yyyy-mm-dd') LIKE '%2005%' 
    修改成 
    SALE_DATE >= '2005-01-01' and SALE_DATE < '2006-01-01' 
    首先感谢,LIKE比这样判断会慢很多么?新手哈,多多指教,另外关于索引..因为毕业设计老师的变态要求,不加
    from tc s  cross join tc t 
    where s.PRODUCT_NAME <>t.PRODUCT_NAME
    只是2个不相等的,还要求不存在AB,BA这种重复
    where a.product_name != b.product_name  不相等的我问题时就说了,另外请教下cross join用笛卡尔积跟我直接交叉会有什么不同么?
    oracle语法不熟..这个楼层的,我数据库就大二学了一学期,过了2年全忘了,刚重新上手一个月,不要像我老师一样,请教他个问题就会说你掌握的不熟练而不是帮助解答
      

  8.   

    昨天写的依然不合格,没有处理年份
    create or replace procedure MIN_SUPPORT2(min_support_number IN VARCHAR2) is
      num varchar2(50);begin  insert into C_2
        (PRODUCT_NAME1, PRODUCT_NAME2, SUPPORT)
      
        select a, b, sum(aaa) w
          from ((select a.product_name a,
                        b.product_name b,
                        case
                          when c - d < 0 then
                           c
                          else
                           d
                        end aaa
                   from (select product_name,
                                sum(product_number) c,
                                to_char(sale_date, 'yyyy') ym
                           from sale
                          group by product_name, to_char(sale_date, 'yyyy')) a,
                        (select product_name,
                                sum(product_number) d,
                                to_char(sale_date, 'yyyy') ym
                           from sale
                          group by product_name, to_char(sale_date, 'yyyy')) b
                 
                  where a.ym = b.ym
                    and a.product_name != b.product_name
                       
                    and a.product_name || b.product_name in
                        (
                         
                         select replace(sys_connect_by_path(rn, '^#^'), '^#^', '')
                           from (select product_name as rn, num
                                    from (select product_name,
                                                 sum(product_number) num
                                            from sale
                                           group by product_name))
                          where level = 2
                         connect by rn > prior rn
                         
                         )
                 
                 ))
         GROUP BY a, b;  commit;end MIN_SUPPORT2;
    ..刚改了..非常乱,不成人形了..谁能帮我搞的好看点100分就送他了,谢谢,另外,传进来那个数大家无视好了,我也没用上