浏览 468 次
|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2008-07-03
零售业里的,20%商品,产生80%的销售,就是要查出是哪些商品的贡献度最大。
如图: 我如何取每类商品中按销售额降序排列后,依次累加直到累计值>=0.8*sum(销售额)的前几种商品的销售额明细。 sql: -- Create table create table TAB_1 ( COD VARCHAR2(10), REC NUMBER(8,4) ); insert into TAB_1 (COD, REC) values ('A', 500); insert into TAB_1 (COD, REC) values ('B', 600); insert into TAB_1 (COD, REC) values ('C', 200); insert into TAB_1 (COD, REC) values ('D', 223); insert into TAB_1 (COD, REC) values ('D', 30); insert into TAB_1 (COD, REC) values ('A', 55); insert into TAB_1 (COD, REC) values ('A', 3); commit; elect m.R1, m.Cod, m.Rec1, n.Rec1 需要查询的数量, n.Cod 需要查询的代码 From (Select Cod, Rec1, Rownum R1 From (Select Cod, Rec1 From (Select Cod, Sum(Rec) Rec1 From Tab_1 a Group By Cod) Order By Rec1)) m, (Select Cod, Rec1, Rownum R2 From (Select Cod, Rec1 From (Select Cod, Sum(Rec) Rec1 From Tab_1 a Group By Cod) Order By Rec1)) n Where m.R1 <= n.R2 And m.R1 = (Select Max(R1) From (Select m.R1, Sum(n.Rec1) From (Select Cod, Rec1, Rownum R1 From (Select Cod, Rec1 From (Select Cod, Sum(Rec) Rec1 From Tab_1 a Group By Cod) Order By Rec1)) m, (Select Cod, Rec1, Rownum R2 From (Select Cod, Rec1 From (Select Cod, Sum(Rec) Rec1 From Tab_1 a Group By Cod) Order By Rec1)) n Where m.R1 <= n.R2 Group By m.R1 Having Sum(n.Rec1) > = (Select Sum(Rec) * 0.8 From Tab_1))) Order By m.Rec1 Desc 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2008-07-07
SQL也不是万事万灵的,
LZ提供的这个场景,用单纯的SQL来实现, 只能得到一个理解困难,效率低下,难于维护的东东 可以考虑把一部分SQL不好实现的逻辑写到程序中 用以下两个SQL文作检索 --查询1 SELECT X.REC_SUM , X.Cod FROM ( SELECT SUM(Rec) AS REC_SUM , Cod FROM Tab_1 a Group By Cod ) X ORDER BY X.REC_SUM DESC / --查询2 SELECT SUM(Rec) AS ALL_REC_SUM FROM Tab_1 / 然后在程序中对查询1的结果进行迭代,对REC_SUM进行累计, 当累计值大于等于ALL_REC_SUM的80%的时候,迭代停止 |
|
| 返回顶楼 | |
|
最后更新时间:2008-07-08
同意楼上,谢谢关注;
|
|
| 返回顶楼 | |
|
最后更新时间:2008-08-19
嘿嘿 这是我的t-sql实现。
同意这个功能在程序中实现更好。 写这个sql只1为了练习sql。 希望能有更多的人参与, 大家交流一下嘛。
select rownm=identity(12), COD, sum(REC) total
into #recsum
from TAB_1
group by COD
order by total des
select COD
from #recsum
where rownm <= (
select min(t.rownm) from
(select rownm, COD, total, (select sum(total) from #recsum where rownm <= o.rownm) totalUntilNow
from #recsum o) t
where t.totalUntilNow > (select sum(REC)*0.8 from TAB_1))
输出: COD ---------- B A D |
|
| 返回顶楼 | |




