有一个表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
这个样只能把大米 —大米这样的删除了,删除不了大米-面粉,面粉-大米这种
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
这个样只能把大米 —大米这样的删除了,删除不了大米-面粉,面粉-大米这种
(SELECT TOP 2 PRODUCT_NAME FROM TB ORDER BY NUM ) AS T
你的意思应该就是取两个最小的NUM再加起来就是了
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)
where a.product_name != b.product_name
这个样只能把大米 —大米这样的删除了,删除不了大米-面粉,面粉-大米这种得到结果为
地瓜 大米 197691 ---楼上的,我这样描述的不够清晰么,我要把 大米 大米 8123478(乱输的) 这种删除
把 大米-面粉,面粉-大米 这种就保留一个,清晰了吧,ORACLE没个自带的这种函数么此乃我毕业设计,要的不是效率,我差点没忍住写个死循环卡死给我毕业设计老师。仍然感谢3楼,我再去看下,争取提高下效率
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出来的数据么,还有更简单的方法的么,有的话说一下,我改改
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
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的组合索引
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年全忘了,刚重新上手一个月,不要像我老师一样,请教他个问题就会说你掌握的不熟练而不是帮助解答
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分就送他了,谢谢,另外,传进来那个数大家无视好了,我也没用上