【商品销售明细表】字段如下:编号 商品编号 销售日期 销售数量【商品表】 字段如下:商品编号 商品名要求:商品销售明细表
inner join 商品表
order by 商品销售明细表.商品编号现在需要把数据抽成如下形式
如果同一商品编号的记录超过三条以上取前三条 不足的填空
前三条记录 合并为一条记录 :例如 商品销售明细表;
1 001 20100520 300
2 001 20100521 500
3 001 20100522 400
8 001 20100528 400
4 002 20100523 800
5 002 20100524 300 6 003 20100525 500 7 004 20100526 400
商品表
001 诺基亚E72
002 诺基亚E71
003 三星5230
004 空调
商品编号 销售量1 销售日期1 销售量2 销售日期2 销售量3 销售日期3
001 300 20100520 500 20100521 400 20100522
002 800 20100523 300 20100524
003 500 20100525
004 400 20100526 想问一下: 能不能用SQL 实现?
inner join 商品表
order by 商品销售明细表.商品编号现在需要把数据抽成如下形式
如果同一商品编号的记录超过三条以上取前三条 不足的填空
前三条记录 合并为一条记录 :例如 商品销售明细表;
1 001 20100520 300
2 001 20100521 500
3 001 20100522 400
8 001 20100528 400
4 002 20100523 800
5 002 20100524 300 6 003 20100525 500 7 004 20100526 400
商品表
001 诺基亚E72
002 诺基亚E71
003 三星5230
004 空调
商品编号 销售量1 销售日期1 销售量2 销售日期2 销售量3 销售日期3
001 300 20100520 500 20100521 400 20100522
002 800 20100523 300 20100524
003 500 20100525
004 400 20100526 想问一下: 能不能用SQL 实现?
解决方案 »
- oracle 的自定义函数中得in参数,out参数 ,一般的参数有什么区别?
- SQL语句语法的错误
- ld: 0711-317 ERROR: Undefined symbol: .trim
- MYSQL脚本怎样转换为ORACLE脚本执行?请大虾帮忙!
- ORACLE只能用建库时的用户名密码??新建用户的话要在前面加上库前缀才能用 ????
- 一道笔试题求解
- XML文件的数据如何导入ORACLE?
- 在执行insert语句的说话出现下面错误
- 导数据时遇到了ROW-00060错误,请各位大侠帮忙瞅瞅!!!
- 请教大家一个问题,有一个后台入库程序每天都要处理用户上传上来的数据
- 关于SQL语句OR的问题
- 如何优化SQL语句?急!
不确定的话就需要使用过程来拼出sql语句动态执行
max(decode(rn,1,销售量 ,0)) as '销售量1'
max(decode(rn,1,销售日期,0)) as '销售日期1',
max(decode(rn,2,销售量 ,0)) as '销售量2'
max(decode(rn,2,销售日期,0)) as '销售日期2',
max(decode(rn,3,销售量 ,0)) as '销售量3'
max(decode(rn,3,销售日期,0)) as '销售日期3'
from (
select 商品编号 ,销售量, 销售日期,
dense_rank()over(partition by 商品编号 order by 商品编号,销售日期 ) as rn
from 商品销售明细表
)
where rn<3
group by 商品编号
java3344520的方案可行
难度比较大,,
(
select * from
(
select b.商品编号,b.销售日期,b.销售数量,
row_number() over(partition by b.商品编号 order by 1) rn
from 商品表 a, 商品销售明细表 b
where a.商品编号 = b.商品编号
)
where rn <=3
),
t1 as
(
select distinct 商品编号,level rn
from 商品表
connect by level <=3
order by 商品编号,rn
)
select
商品编号,
sum(decode(rn,1,销售数量)) 销售量1,
sum(decode(rn,1,销售日期)) 销售日期1,
sum(decode(rn,2,销售数量)) 销售量2,
sum(decode(rn,2,销售日期)) 销售日期2,
sum(decode(rn,3,销售数量)) 销售量3,
sum(decode(rn,3,销售日期)) 销售日期3
from
(
select * from tt
union all
select 商品编号,null,null,rn
from t1
where (商品编号,rn) not in(select 商品编号,rn from tt)
)
group by 商品编号
order by 商品编号
;
不准,应该是标准SQL,就是SQL 99啊,这个对我习惯PL/SQL的人来说有点难度,关注。
WITH 商品销售明细表 AS(
SELECT 1 编号,'001' 商品编号,'20100520' 销售日期,300 数量 FROM dual
UNION ALL SELECT 2,'001','20100521',500 FROM dual
UNION ALL SELECT 3,'001','20100522',400 FROM dual
UNION ALL SELECT 8,'001','20100528',400 FROM dual
UNION ALL SELECT 4,'002','20100523',800 FROM dual
UNION ALL SELECT 5,'002','20100524',300 FROM dual
UNION ALL SELECT 6,'003','20100525',500 FROM dual
UNION ALL SELECT 7,'004','20100526',400 FROM dual)
,商品表 AS(
SELECT '001' 商品编号,'诺基亚E72' 商品名 FROM dual
UNION ALL SELECT '002','诺基亚E71' FROM dual
UNION ALL SELECT '003','三星5230' FROM dual
UNION ALL SELECT '004','空调' FROM dual)
--以上为测试数据
SELECT 商品编号,
sum(CASE flag WHEN 1 THEN 数量 END) AS 销售量1,
MAX(CASE flag WHEN 1 THEN 销售日期 END) AS 销售日期1,
sum(CASE flag WHEN 2 THEN 数量 END) AS 销售量2,
MAX(CASE flag WHEN 2 THEN 销售日期 END) AS 销售日期2,
sum(CASE flag WHEN 3 THEN 数量 END) AS 销售量3,
MAX(CASE flag WHEN 3 THEN 销售日期 END) AS 销售日期3
from(
SELECT t1.*,t2.商品名,
(CASE WHEN not EXISTS(
SELECT 1 FROM 商品销售明细表 WHERE 商品编号=t1.商品编号
AND 销售日期<t1.销售日期) THEN 1
WHEN (SELECT count(1) FROM 商品销售明细表 WHERE 商品编号=t1.商品编号
AND 销售日期<t1.销售日期)<2 THEN 2
else 3 end) as flag
FROM 商品销售明细表 t1 INNER JOIN 商品表 t2
ON t1.商品编号=t2.商品编号)
GROUP BY 商品编号
order by 商品编号;
AND (SELECT count(1) FROM 商品销售明细表 WHERE 商品编号=t1.商品编号
AND 销售日期<t1.销售日期)<3