ITPUB论坛-中国最专业的IT技术社区

 
 注册
热搜:
查看: 148|回复: 3

求教sql写法

[复制链接]
论坛徽章:
5
马上有对象
日期:2014-11-18 19:34:01马上有对象
日期:2014-11-24 20:41:20沸羊羊
日期:2015-03-04 14:55:412015年新春福章
日期:2015-03-06 11:59:47天蝎座
日期:2015-07-28 15:20:51
跳转到指定楼层
1#
发表于 2017-12-1 10:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
背景:投入产出表,上一行的output可能为下一行的input;比如:A投入1000,产出了A1:100,A2:200,A3:300;A1又作为input,input_qty则为100,产出了,A11:10,A12:30,A13:40,所有剩余量不考虑。规则是INPUT_QTY按负数计算,output_qty按正数计算
input
input_QTY
output
output_qty
A
1000
A1
100
A
1000
A2
200
A
1000
A3
300
A1
100
A11
10
A1
100
A12
30
A1
100
A13
40
A2
200
A21
40


想实现:
A
-1000
A1
0
A2
0
A3
300
A11
10
A12
30
A13
40
A21
40
说明:A 只有input,所以是-1000,A1 的output_qty是100,但又作为input,数量100,所以结果为100-100=0;A3没有作为input所以为300.
  1. CREATE TABLE TEST20171201
  2. (
  3.    input        VARCHAR2 (30),
  4.    input_QTY    NUMBER,
  5.    output       VARCHAR2 (30),
  6.    output_qty   NUMBER
  7. );
  8. insert into TEST20171201 (INPUT, INPUT_QTY, OUTPUT, OUTPUT_QTY)
  9. values ('A', 1000, 'A1', 100);

  10. insert into TEST20171201 (INPUT, INPUT_QTY, OUTPUT, OUTPUT_QTY)
  11. values ('A', 1000, 'A2', 200);

  12. insert into TEST20171201 (INPUT, INPUT_QTY, OUTPUT, OUTPUT_QTY)
  13. values ('A', 1000, 'A3', 300);

  14. insert into TEST20171201 (INPUT, INPUT_QTY, OUTPUT, OUTPUT_QTY)
  15. values ('A1', 100, 'A11', 10);

  16. insert into TEST20171201 (INPUT, INPUT_QTY, OUTPUT, OUTPUT_QTY)
  17. values ('A1', 100, 'A12', 30);

  18. insert into TEST20171201 (INPUT, INPUT_QTY, OUTPUT, OUTPUT_QTY)
  19. values ('A1', 100, 'A13', 40);

  20. insert into TEST20171201 (INPUT, INPUT_QTY, OUTPUT, OUTPUT_QTY)
  21. values ('A2', 200, 'A21', 40);
复制代码
请教单独用sql能否实现,谢谢。

认证徽章
论坛徽章:
2
ITPUB14周年纪念章
日期:2015-10-26 17:24:11狮子座
日期:2016-04-05 18:53:15
2#
发表于 2017-12-1 13:11 | 只看该作者
本帖最后由 changhg10101 于 2017-12-1 13:13 编辑

WITH IN_PUT AS
(SELECT DISTINCT A.INPUT, A.INPUT_QTY FROM TEST20171201 A),
OUT_PUT AS
(SELECT DISTINCT B.OUTPUT, B.OUTPUT_QTY FROM TEST20171201 B)
SELECT NVL(Y.OUTPUT, X.INPUT) IN_OUT,
       (NVL(Y.OUTPUT_QTY, 0) - NVL(X.INPUT_QTY, 0)) QTY
  FROM IN_PUT X
  FULL JOIN OUT_PUT Y
    ON X.INPUT = Y.OUTPUT
ORDER BY LENGTH(IN_OUT), 1

使用道具 举报

回复
认证徽章
论坛徽章:
2
ITPUB14周年纪念章
日期:2015-10-26 17:24:11狮子座
日期:2016-04-05 18:53:15
3#
发表于 2017-12-1 13:11 | 只看该作者
你把它想复杂了吧。。。很简单的关联啊

使用道具 举报

回复
论坛徽章:
4
秀才
日期:2017-08-11 15:38:46秀才
日期:2017-09-08 11:09:50秀才
日期:2017-09-25 15:10:28秀才
日期:2017-09-25 15:10:28
4#
发表于 2017-12-1 13:17 | 只看该作者
SQL> SELECT decode(a.input, '', b.output, a.input) kind,
  2         0 - nvl(a.input_qty, 0) + nvl(b.output_qty, 0) qty
  3    FROM (SELECT DISTINCT input, input_qty FROM test20171201) a
  4    FULL JOIN (SELECT DISTINCT output, output_qty FROM test20171201) b
  5      ON a.input = b.output
  6   ORDER BY nvl(substr(kind, 2), 0) + 0;

KIND                              QTY
------------------------------ ----------
A                                  -1000
A1                                    0
A2                                    0
A3                                  300
A11                                 10
A12                                 30
A13                                 40
A21                                 40

使用道具 举报

回复

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

本版积分规则

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