论坛首页 综合技术版 Database

关于零售业中的二八sql统计

浏览 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
  • 275f9c46-abf6-3d90-8dc9-c3e3bfd8d74f-thumb
  • 描述: 商品销售情况图。想取得销售排前几名累计总额达到总销售的80%名单
  • 大小: 45.5 KB
   
最后更新时间: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%的时候,迭代停止
   
0 请登录后投票
最后更新时间:2008-07-08
同意楼上,谢谢关注;

偶只是变态的想通过一个语句来实现,看看到底能实现不
   
0 请登录后投票
最后更新时间: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
   
0 请登录后投票
论坛首页 综合技术版 Database

跳转论坛:
JavaEye推荐