ORACLE数据库统计问题!

绿色为正常业务数据,下面数据是现在统计出来得结果。
入库多统计了一次,这是不行得 不然统计总数得时候也会多统计。
如果把出库合并 出库时间又没办法处理。
如何让入库不多统计 出库也不用合并?

5个回答

--运行结果
图片说明

图片说明

这种情况建议你 入库和出库分开用两张表记录,这样的可读性更强,也方便观察数据;如果不考虑用两张表,建议你再加一列记录类型type(1是入库 2是出库)这样区分开,在查数据的时候加上这个条件就行了。

--以下语句在Navicat Premium中执行成功,不同的工具请看情况修改语法
--建立入库表,id列看情况可以去掉
CREATE TABLE "t_test_tmp_r" (
"rdate" DATE NULL ,
"rnum" NUMBER(12,2) NULL ,
"id" NUMBER(12) NULL
);
ALTER TABLE "t_test_tmp_r" ADD UNIQUE ("id");
--插入入库数据
INSERT INTO "t_test_tmp_r" VALUES (TO_DATE('2018-06-06 10:57:13', 'YYYY-MM-DD HH24:MI:SS'), '20', '0');
INSERT INTO "t_test_tmp_r" VALUES (TO_DATE('2018-07-02 10:38:27', 'YYYY-MM-DD HH24:MI:SS'), '50', '1');
INSERT INTO "t_test_tmp_r" VALUES (TO_DATE('2018-07-19 10:38:52', 'YYYY-MM-DD HH24:MI:SS'), '220', '2');
INSERT INTO "t_test_tmp_r" VALUES (TO_DATE('2018-07-23 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), '130', '3');

--建立出库表
CREATE TABLE "t_test_tmp_c" (
"cdate" DATE NULL ,
"cnum" NUMBER(12,2) NULL ,
"id" NUMBER(20) NULL
);
--插入出库数据
INSERT INTO "JENKINS"."t_test_tmp_c" VALUES (TO_DATE('2018-07-10 10:39:59', 'YYYY-MM-DD HH24:MI:SS'), '30', '1');
INSERT INTO "JENKINS"."t_test_tmp_c" VALUES (TO_DATE('2018-07-27 10:40:55', 'YYYY-MM-DD HH24:MI:SS'), '70', '2');
INSERT INTO "JENKINS"."t_test_tmp_c" VALUES (TO_DATE('2018-08-16 10:41:10', 'YYYY-MM-DD HH24:MI:SS'), '200', '3');
INSERT INTO "JENKINS"."t_test_tmp_c" VALUES (TO_DATE('2018-08-22 10:41:23', 'YYYY-MM-DD HH24:MI:SS'), '100', '4');

--以下为查询方法
--入库表t_test_tmp_r列:rdate入库时间,rnum入库数量
--出库表t_test_tmp_c列:cdate出库时间,cnum出库数量
--TR表示入库表t_test_tmp_r,TC表示出库表t_test_tmp_c
with TR
AS
(select sum("rnum") AS 入库 ,"TO_CHAR"("rdate", 'yyyy-mm') AS 月份 from "t_test_tmp_r" GROUP BY "TO_CHAR"("rdate", 'yyyy-mm'))
,
TC
AS
(select sum("cnum") AS 出库 ,"TO_CHAR"("cdate", 'yyyy-mm') AS 月份 from "t_test_tmp_c" GROUP BY "TO_CHAR"("cdate", 'yyyy-mm'))

SELECT TR.入库 AS 入库,TC."出库" AS 出库,TR."月份" FROM
TR FULL JOIN TC
ON TR.月份=TC.月份 ORDER BY 月份 ASC

--上个查询出库没有月份,不符合,修改一下,表和数据不变
with TR
AS
(select sum("rnum") AS 入库 ,"TO_CHAR"("rdate", 'yyyy-mm') AS 月份 from "t_test_tmp_r" GROUP BY "TO_CHAR"("rdate", 'yyyy-mm'))
,
TC
AS
(select sum("cnum") AS 出库 ,"TO_CHAR"("cdate", 'yyyy-mm') AS 月份 from "t_test_tmp_c" GROUP BY "TO_CHAR"("cdate", 'yyyy-mm'))

SELECT TR.入库 AS 入库,TC."出库" AS 出库,TR."月份" AS 月份 FROM
TR LEFT JOIN TC
ON TR.月份=TC.月份-- ORDER BY 月份 asc
UNION
SELECT NULL AS 入库 ,TC."出库" AS 出库, TC."月份" AS 月份
FROM TC
LEFT JOIN TR ON TC.月份=TR.月份
WHERE NOT EXISTS
(
SELECT 1 FROM TR
WHERE TR."月份"=TC."月份"
)

--运行结果
图片说明

qq_23379659
qq_23379659 感谢老铁,幸苦了。虽然解决办法不是你这个,但是没有你得思路还真没想到。感谢感谢
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!