特难的SQL,请高书帮助,急,跪求各位大峡!!!

tian790317 2008-11-23 08:49:40
加精
我的表结构是这样的
itemcode 销售数量 次数 级别
00001 15 2
00002 15 2
00003 10 1
00004 10 2
00005 10 1
00006 8 2
00007 8 1
00008 7 1
00009 6 2
00010 5 2
00011 3 2
00012 1 1
00013 1 1
00014 1 1
我的要求是根据销售总数量进行汇总,然后根据销售数量的排序(desc)一条一条往下加,当达到销售总数量40%时,次数>1的级别为A1,等于1的级别为A2,然后重新从下条开始累加,达到销售总数量36%时, 次数>1的级别为B1,等于1的级别为B2,达到销售总数量18%时, 次数>1的级别为C1,等于1的级别为C2,达到销售总数量6%时, 次数>1的级别为D1,等于1的级别为D2,
具体结果为:
itemcode 销售数量 次数 级别
00001 15 2 A1
00002 15 2 A1
00003 10 1 A2
00004 10 2 B1
00005 10 1 B2
00006 8 2 B1
00007 8 1 B2
00008 7 1 C2
00009 6 2 C1
00010 5 2 C1
00011 3 2 D1
00012 1 1 D2
00013 1 1 D2
00014 1 1 D2

...全文
6824 102 打赏 收藏 转发到动态 举报
写回复
用AI写文章
102 条回复
切换为时间正序
请发表友善的回复…
发表回复
zkn2012zkn 2012-10-31
  • 打赏
  • 举报
回复
牛人真多啊,菜鸟表示佩服
gunOrose 2012-08-20
  • 打赏
  • 举报
回复
标记下,有时间再看看
ORAClE SE 2012-07-19
  • 打赏
  • 举报
回复
神贴还在。
SignLCF 2012-04-26
  • 打赏
  • 举报
回复
--over
update SALE s1
set leve=(
select (CASE
WHEN PreCent <= 40 THEN
(CASE
WHEN times > 1 THEN
'A1'
WHEN times = 1 THEN
'A2'
END) WHEN PreCent <= 76 THEN(CASE
WHEN times > 1 THEN
'B1'
WHEN times = 1 THEN
'B2'
END) WHEN PreCent <= 94 THEN(CASE
WHEN times > 1 THEN
'C1'
WHEN times = 1 THEN
'C2'
END) WHEN PreCent <= 100 THEN(CASE
WHEN times > 1 THEN
'D1'
WHEN times = 1 THEN
'D2'
END) END) LEVE
from (select ItemCode,
SalNum,
times,
sum(SalNum) over(order by SalNum desc, ItemCode) LineSum, --连续总销售和,
sum(SalNum) over() AllSum, --销售总和,
100 * ROUND(sum(SalNum) over(order by SalNum desc, ItemCode) /
sum(SalNum) over(),
4) PreCent --所占总份额%
from sale) s2
where s1.itemcode=s2.itemCode)
gangwan189 2012-02-14
  • 打赏
  • 举报
回复
好东西呀,这脑袋练就的!!!!!!!!!!!!!
JS 2012-02-14
  • 打赏
  • 举报
回复
个人觉得需求还是挺明确的 实现起来也不复杂 但是不知道做这样的分析有什么价值吗 暂时看不出来
JS 2012-02-14
  • 打赏
  • 举报
回复
来晚啦 没有凑到热闹
BlueskyWide 2012-01-30
  • 打赏
  • 举报
回复
2011年8月份,本人写了篇博客对此贴作的几种方法作了个比较,可参见拙文:

http://blog.sina.com.cn/s/blog_57527e520100w9w4.html
letianyue 2012-01-20
  • 打赏
  • 举报
回复
存储过程实现很简单,就不说了。
下面用sql方式实现:
1、建表
create table giti_test
(
itemcode varchar2(10),
sale_qty number,
sale_time number,
grade varchar2(10)
);
2、插入数据,自己随意
3、编写sql程序
SELECT T3.ITEMCODE,
T3.SALE_QTY,
T3.SALE_TIME,
CASE
WHEN T3.GRADE_FLAG=1 THEN DECODE(T3.SALE_TIME,1,'A2','A1')
WHEN T3.GRADE_FLAG=2 THEN DECODE(T3.SALE_TIME,1,'B2','B1')
WHEN T3.GRADE_FLAG=3 THEN DECODE(T3.SALE_TIME,1,'C2','C1')
WHEN T3.GRADE_FLAG=4 THEN DECODE(T3.SALE_TIME,1,'D2','D1')
END AS GRADE_NEW,
T3.GRADE
FROM (
SELECT T2.ITEMCODE,
T2.SALE_QTY,
T2.SALE_TIME,
T2.SUM_QTY,
T2.SSS_QTY,
T2.P40,
T2.P36,
T2.P18,
T2.P6,
CASE WHEN T2.SUM_QTY<=T2.P40 OR T2.SSS_QTY-T2.SALE_QTY<T2.P40 THEN 1
WHEN T2.SUM_QTY>T2.P40 AND (T2.SUM_QTY<=T2.P36 OR T2.SSS_QTY-T2.SALE_QTY<T2.P36) THEN 2
WHEN T2.SUM_QTY>T2.P36 AND (T2.SUM_QTY<=T2.P18 OR T2.SSS_QTY-T2.SALE_QTY<T2.P18) THEN 3
WHEN T2.SUM_QTY>T2.P18 AND (T2.SUM_QTY<=T2.P6 OR T2.SSS_QTY-T2.SALE_QTY<T2.P6) THEN 4
ELSE 0
END AS GRADE_FLAG,
T2.GRADE
FROM (
SELECT T1.ITEMCODE,
T1.SALE_QTY,
T1.SALE_TIME,
T1.SUM_QTY,
SUM(T1.SUM_QTY-T1.SALE_QTY) OVER(PARTITION BY 1 ORDER BY T1.SUM_QTY) SSS_QTY,
T1.TOTAL_QTY*40/100 P40,
T1.TOTAL_QTY*(40+36)/100 P36,
T1.TOTAL_QTY*(40+36+18)/100 P18,
T1.TOTAL_QTY*(40+36+18+6)/100 P6,
T1.GRADE
FROM (SELECT T.ITEMCODE,
T.SALE_QTY,
T.SALE_TIME,
SUM(T.SALE_QTY) OVER(PARTITION BY 1 ORDER BY T.SALE_QTY DESC, T.ITEMCODE) SUM_QTY,
SUM(T.SALE_QTY) OVER(PARTITION BY 1) TOTAL_QTY,
T.GRADE
FROM GITI_TEST T
ORDER BY T.SALE_QTY DESC, T.ITEMCODE) T1) T2) T3
ro5225 2012-01-13
  • 打赏
  • 举报
回复
激动啊,马克!!
lws5254 2011-12-13
  • 打赏
  • 举报
回复
哎 学习了
hedajisuanji 2011-08-30
  • 打赏
  • 举报
回复
学习。
s123568 2011-08-21
  • 打赏
  • 举报
回复
精华贴 留名
arameter 2011-08-04
  • 打赏
  • 举报
回复
精华。。。
xinxiangsui2008 2011-06-09
  • 打赏
  • 举报
回复
学习。。。。
plafang 2011-06-07
  • 打赏
  • 举报
回复
学习。。。。
zhanglibin_1222 2011-04-21
  • 打赏
  • 举报
回复
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
zhendeainixinxin 2011-03-16
  • 打赏
  • 举报
回复
真的该好好学习了
sy1987112038 2011-02-25
  • 打赏
  • 举报
回复
MARK
猫大侠 2011-02-24
  • 打赏
  • 举报
回复
学习了```
加载更多回复(81)

3,490

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧