楼主: darkstorm

[精华] SQL 大挑战-- 可以放到精华区的几个命题

[复制链接]
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
21#
发表于 2002-8-11 10:22 | 只看该作者

hehe

1:  运行性能的问题,如果你是 816以上版本采用新的分析函数,肯定会有改观

2:至于你的A字段上有重复的问题,因为在先前的题目中并没有提出来,并且根据题意,是不会有重复的。假如你真要重复,这也是很好解决的,先合并成一个就ok了。其实重要的是思路是吧,具体的这些问题都很好解决的

BTW:建议你阅读816以上的分析函数,将有很大的收获

使用道具 举报

回复
论坛徽章:
0
22#
发表于 2002-8-12 13:16 | 只看该作者

to biti_rainy 如果你的 M 这个字段的值不是连续的,你这个查询能解决么?

可以
SQL> select * from sum;

M       CNT      INER      OUER
- --------- --------- ---------
1         1         5         5
2         6        15         5
4         1        10         5
5         1        40         5


SQL> select c.month,
  2  SUM(C.INER),
  3  SUM(C.OUER),
  4  (E.INER-E.OUER)
  5  from (select a.month,
  6  sum(a.cnt),
  7  sum(b.cnt) cnt_1,
  8  SUM(B.INER) INER ,
  9  SUm(B.OUER) OUER
10  from sum a,
11  (select sum.
12  month,
13  sum(sum.cnt) cnt,
14  SUM(INER) INER,
15  SUM(OUER) OUER
16  from sum
17  group by sum.month) b
18  where a.month>=b.month
19  group by a.month) e,
20  sum c
21  where c.month=e.month
22  group by c.month,e. cnt_1,(E.INER-E.OUER)
23  
SQL> /

M SUM(C.INER) SUM(C.OUER) (E.INER-E.OUER)
- ----------- ----------- ---------------
1           5           5               0
2          15           5              10
4          10           5              15
5          40           5              50

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
23#
发表于 2002-8-12 13:38 | 只看该作者

nanquanc

我说的是第3个问题
你还是没有明白
就是不连续的,需要你去补连续 ,ok?

使用道具 举报

回复
论坛徽章:
0
24#
发表于 2002-8-14 10:49 | 只看该作者
问题改动一下:
TABLE如下
mdate       begin income payout balance
2000-3-1  10      50        30        30
2000-3-2  30      45        60        15
2000-3-5  15      60        10        65

能否用SELECT語句得出以下結果
mdate       begin income payout balance
2000-3-1  10      50        30        30
2000-3-2  30      45        60        15
2000-3-3  15      0          0          15
2000-3-4  15      0          0          15
2000-3-5  15      60        10        65

有时一个系统开始投入运行时初值并不为0,需要手工建一个初值
这个问题就是如此。
我想了好一会,也没想出来怎样才能把初值10加到每一个余额中?
请biti_rainy帮忙解决一下。

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
25#
发表于 2002-8-14 11:17 | 只看该作者

这是一个简单的加减来解决的

当然如果你需要begin为当前行之前的N行处的值的话,需要使用分析函数本身来解决
我这里只是简单的这么处理了

SQL> select * from test;

         A          B          C D
---------- ---------- ---------- --------------------
         1          2          3 4
         6          7          8 9
         3          1          2 1

SQL>  select tt2.tta, tt2.ttb, tt2.ttc, sum(tt2.ttb - tt2.ttc) over(order by tt2.tta) youwant
  2   from
  3   (
  4   select t1.aa tta,decode(t2.a,null,0,t2.b) ttb,decode(t2.a,null,0,t2.c) ttc
  5   from
  6   (select ((select min(a) from test) + rownum - 1) aa from all_objects
  7   where rownum <= (select max(a) - min(a) +1 from test)) t1,
  8   test t2
  9   where t1.aa = t2.a(+)
10   ) tt2;

       TTA        TTB        TTC    YOUWANT
---------- ---------- ---------- ----------
         1          2          3         -1
         2          0          0         -1
         3          1          2         -2
         4          0          0         -2
         5          0          0         -2
         6          7          8         -3

已选择6行。

SQL> select tt2.tta, tt2.ttb, tt2.ttc,10 + sum(tt2.ttb - tt2.ttc) over(order by tt2.tta) youwant
  2   from
  3   (
  4   select t1.aa tta,decode(t2.a,null,0,t2.b) ttb,decode(t2.a,null,0,t2.c) ttc
  5   from
  6   (select ((select min(a) from test) + rownum - 1) aa from all_objects
  7   where rownum <= (select max(a) - min(a) +1 from test)) t1,
  8   test t2
  9   where t1.aa = t2.a(+)
10   ) tt2;

       TTA        TTB        TTC    YOUWANT
---------- ---------- ---------- ----------
         1          2          3          9
         2          0          0          9
         3          1          2          8
         4          0          0          8
         5          0          0          8
         6          7          8          7

已选择6行。

SQL>  select tt2.tta, tt2.ttb, tt2.ttc,
  2   10 + sum(tt2.ttb - tt2.ttc) over(order by tt2.tta) + tt2.ttc - tt2.ttb  begin,
  3   10 + sum(tt2.ttb - tt2.ttc) over(order by tt2.tta) youwant
  4   from
  5   (
  6   select t1.aa tta,decode(t2.a,null,0,t2.b) ttb,decode(t2.a,null,0,t2.c) ttc
  7   from
  8   (select ((select min(a) from test) + rownum - 1) aa from all_objects
  9   where rownum <= (select max(a) - min(a) +1 from test)) t1,
10   test t2
11   where t1.aa = t2.a(+)
12   ) tt2;

       TTA        TTB        TTC      BEGIN    YOUWANT
---------- ---------- ---------- ---------- ----------
         1          2          3         10          9
         2          0          0          9          9
         3          1          2          9          8
         4          0          0          8          8
         5          0          0          8          8
         6          7          8          8          7

已选择6行。

SQL>

使用道具 举报

回复
论坛徽章:
0
26#
发表于 2002-8-14 11:45 | 只看该作者
把常数10写到SELECT语句中恐怕不行吧?初值10是一个开发时并不知道的量,由用户输入。
而且若这个表放的是商品库存,里面会有很多商品,每一个商品的初始库存都是不一样的,这应该如何处理?

请指教

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
27#
发表于 2002-8-14 11:54 | 只看该作者

你把它当一个变量传进去

至于你怎么读取到变量的值,那是你解决的问题了

仅仅把10替换成一个变量就可以了,不是么?

使用道具 举报

回复
论坛徽章:
0
28#
发表于 2002-8-14 12:12 | 只看该作者
要查询所有商品的库存时,如何把每一个商品的初始库存量都放到变量中?

使用道具 举报

回复
论坛徽章:
0
29#
发表于 2002-8-14 12:13 | 只看该作者

Re: 你把它当一个变量传进去

最初由 biti_rainy 发布
[B]至于你怎么读取到变量的值,那是你解决的问题了

仅仅把10替换成一个变量就可以了,不是么? [/B]



最重要的是仅用一条select 语句实现多个不同商品的查询!

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
30#
发表于 2002-8-14 12:44 | 只看该作者

那也行啊

这里也可以嵌一个子查询啊

或者
先把这个结果集取出来
再跟初始值的做表连接/或者利用游标什么的来处理

总之,我以为:有具体的需求摆在面前,总是能解决的,重要的是适当的考虑效率问题

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表