12
返回列表 发新帖
楼主: ys_yinqin

[PL/SQL] oracle查询旬月数据并计算咨询

[复制链接]
论坛徽章:
1
山治
日期:2016-11-01 10:13:33
11#
 楼主| 发表于 2016-11-1 14:16 | 只看该作者
本帖最后由 ys_yinqin 于 2016-11-1 14:27 编辑

@bell6248 版主你好,我运行你给我的代码后,
结果为
序号 年 月 A的累计值  A的累计值1

怎么才能得到
序号 年 月 旬月标示  A的累计值1 啊?

使用道具 举报

回复
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
12#
发表于 2016-11-1 14:25 | 只看该作者
ys_yinqin 发表于 2016-11-1 14:16
@bell6248 版主你好,我运行你给我的代码后,
结果为
序号 年 月 A的累计值  A的累计值1

表别名改改即可

select  "序号",
        "年",
        "月",
        decode(grp, '01', 4, "旬月标示") "旬月标示",
        "A的累计值"
from
(select "序号",
        "年",
        "月",
        "旬月标示",
        sum("A的累计值") "A的累计值",
        grouping("序号") || grouping("旬月标示") grp,
        count(*) cnt
from
(SELECT id "序号",
        to_char(dates, 'yyyy') "年",
        to_char(dates, 'mm') "月",
        decode(trunc((to_number(to_char(dates, 'dd')) - 1) / 10),
              0,
              '1',
              1,
              '2',
              '3') "旬月标示",
       sum(A) "A的累计值"
  FROM test1
group by id,
          decode(trunc((to_number(to_char(dates, 'dd')) - 1) / 10),
                 0,
                 '1',
                 1,
                 '2',
                 '3'),
          to_char(dates, 'yyyy'),
          to_char(dates, 'mm')
  order by 1, 2, 3, 4)
group by rollup(("序号", "年", "月"), "旬月标示")
having grouping("序号") <> 1)
where grp = '00'
   or (grp = '01' and cnt > 1)

使用道具 举报

回复
论坛徽章:
1
山治
日期:2016-11-01 10:13:33
13#
 楼主| 发表于 2016-11-1 14:28 | 只看该作者
谢谢@bell6248

使用道具 举报

回复
论坛徽章:
1
山治
日期:2016-11-01 10:13:33
14#
 楼主| 发表于 2016-11-1 17:29 | 只看该作者
本帖最后由 ys_yinqin 于 2016-11-1 18:19 编辑
bell6248 发表于 2016-11-1 14:25
表别名改改即可

select  "序号",

版主你好
如果我希望结果是如下这样,需要怎么修改呢?
--希望得到的结果

序号                            年                月        旬月标示            累计A值                   修改时间
50201281        2015        1           1                       6                  11/1/2016 10:07:14
50201281        2015        1           2                      15               11/1/2016 10:07:14
50201281        2015        1           3                      24               11/1/2016 10:07:14
50201281        2015        1           4                      45               11/1/2016 10:07:14
50201282        2016        1          1                      33               11/1/2016 10:07:14
50201282        2016        1          4                      33               11/1/2016 10:07:14


已经搞定
select  "序号",
        "年",
        "月",
        decode(grp, '01', 4, "旬月标示") "旬月标示",
        "A的累计值"
from
(select "序号",
        "年",
        "月",
        "旬月标示",
        sum("A的累计值") "A的累计值",
        grouping("序号") || grouping("旬月标示") grp,
        count(*) cnt
from
(SELECT id "序号",
        to_char(dates, 'yyyy') "年",
        to_char(dates, 'mm') "月",
        decode(trunc((to_number(to_char(dates, 'dd')) - 1) / 10),
              0,
              '1',
              1,
              '2',
              '3') "旬月标示",
       sum(A) "A的累计值"
  FROM test
group by id,
          decode(trunc((to_number(to_char(dates, 'dd')) - 1) / 10),
                 0,
                 '1',
                 1,
                 '2',
                 '3'),
          to_char(dates, 'yyyy'),
          to_char(dates, 'mm')
  order by 1, 2, 3, 4)
group by rollup(("序号", "年", "月"), "旬月标示")
having grouping("序号") <> 1)
where grp = '00'
   or (grp = '01')

使用道具 举报

回复
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
15#
发表于 2016-11-1 18:22 | 只看该作者
ys_yinqin 发表于 2016-11-1 17:29
版主你好
如果我希望结果是如下这样,需要怎么修改呢?
--希望得到的结果



代码要改改了, 具体如下:


SQL> select * from test1;

ID                               DATES                A
-------------------------------- ----------- ----------
50201281                         2015/1/1             1
50201281                         2015/1/2             2
50201281                         2015/1/3             3
50201281                         2015/1/11            4
50201281                         2015/1/12            5
50201281                         2015/1/13            6
50201281                         2015/1/22            7
50201281                         2015/1/23            8
50201281                         2015/1/24            9
50201282                         2011/1/1            10
50201282                         2011/1/2            11
50201282                         2011/1/3            12

12 rows selected

SQL>
SQL> with t1 as
  2  (
  3  select id,
  4         years,
  5         months,
  6         decode(grp, '01', 4, rn_flag) rn_flag,
  7         sum_a
  8    from (select id,
  9                 years,
10                 months,
11                 rn_flag,
12                 sum(sum_a) sum_a,
13                 grouping(id) || grouping(rn_flag) grp,
14                 count(*) cnt
15            from (SELECT id,
16                         to_char(dates, 'yyyy') years,
17                         to_char(dates, 'mm') months,
18                         decode(trunc((to_number(to_char(dates, 'dd')) - 1) / 10),
19                                0,
20                                '1',
21                                1,
22                                '2',
23                                '3') rn_flag,
24                         sum(A) sum_a
25                    FROM test1
26                   group by id,
27                            decode(trunc((to_number(to_char(dates, 'dd')) - 1) / 10),
28                                   0,
29                                   '1',
30                                   1,
31                                   '2',
32                                   '3'),
33                            to_char(dates, 'yyyy'),
34                            to_char(dates, 'mm')
35                   order by 1, 2, 3, 4)
36           group by rollup((id, years, months), rn_flag)
37          having grouping(id) <> 1)
38   where grp = '00'
39      or (grp = '01' and cnt > 1)
40  ),
41  t2 as
42  (
43  select a2.id,
44         a2.years,
45         a2.months,
46         a1.rn
47    from (select level rn from dual connect by level <= 4) a1,
48         (select id,
49                 to_char(dates, 'yyyy') years,
50                 to_char(dates, 'mm') months
51            from test1
52           group by id, to_char(dates, 'yyyy'), to_char(dates, 'mm')) a2
53  )
54  select t2.id 序号,
55         t2.years 年,
56         t2.months 月,
57         t2.rn 旬月标示,
58         decode(t2.rn, 4, sum(decode(t2.rn, 4, 0, nvl(t1.sum_a, 0))) over(partition by t2.id, t2.years, t2.months), nvl(t1.sum_a, 0)) 累计A值
59    from t1, t2
60   where t1.id(+) = t2.id
61     and t1.years(+) = t2.years
62     and t1.months(+) = t2.months
63     and t1.rn_flag(+) = t2.rn
64  order by 1, 2, 3, 4
65  /

序号                             年   月   旬月标示    累计A值
-------------------------------- ---- -- ---------- ----------
50201281                         2015 01          1          6
50201281                         2015 01          2         15
50201281                         2015 01          3         24
50201281                         2015 01          4         45
50201282                         2011 01          1         33
50201282                         2011 01          2          0
50201282                         2011 01          3          0
50201282                         2011 01          4         33

8 rows selected




1人打赏

使用道具 举报

回复
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
16#
发表于 2016-11-1 18:26 | 只看该作者
bell6248 发表于 2016-11-1 18:22
代码要改改了, 具体如下:

你要的结果又变了吗, 原想是要把没有的旬月标示也要列出, 我看你#14楼又改了, 我的代码就是你没有该之前的, 反正大体的思路就是这样的

使用道具 举报

回复
论坛徽章:
1
山治
日期:2016-11-01 10:13:33
17#
 楼主| 发表于 2016-11-1 18:43 | 只看该作者
bell6248 发表于 2016-11-1 18:26
你要的结果又变了吗, 原想是要把没有的旬月标示也要列出, 我看你#14楼又改了, 我的代码就是你没有该之 ...

感谢 感谢 感谢 感谢!!!!!!!!!!!!!!!

使用道具 举报

回复
论坛徽章:
1
山治
日期:2016-11-01 10:13:33
18#
 楼主| 发表于 2016-11-1 18:45 | 只看该作者
bell6248 发表于 2016-11-1 18:26
你要的结果又变了吗, 原想是要把没有的旬月标示也要列出, 我看你#14楼又改了, 我的代码就是你没有该之 ...

版主 你这么牛

有没有oracle相关的书推荐下?趁着双11,买几本回来啃啃,我觉得这么复杂的统计表,你这么快就写出来了。。。。

使用道具 举报

回复
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
19#
发表于 2016-11-1 19:12 | 只看该作者
ys_yinqin 发表于 2016-11-1 18:45
版主 你这么牛

有没有oracle相关的书推荐下?趁着双11,买几本回来啃啃,我觉得这么复杂的统计表,你 ...

有关oracle是很多了, 你买基本经典即可

使用道具 举报

回复

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

本版积分规则 发表回复

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