【发布时间】:2016-08-22 21:31:00
【问题描述】:
相信我,我已经尽力找到这个问题了。我有 MYSQL 和 SQLServer 解决方案,而不是 Oracle,也没有我需要的特定汇总。 由于我使用的 Oracle 版本中没有 Cross Apply,所以我遇到了障碍。
问题对你们中的许多人来说很简单。
对我来说,宇宙的起点是 13 个月。
我有一张桌子
CREATE TABLE TBLTESTAUM (
ORDER_NO NUMBER(10,0) NOT NULL ENABLE,
RECORD_DATE DATE,
Order_SEQUENCE NUMBER(5,0) NOT NULL ENABLE,
CLASS NUMBER(3,0));
INSERT INTO TBLTESTAUM VALUES (1234, '29-Aug-2015', 34, 459);
INSERT INTO TBLTESTAUM VALUES (1234, '20-Jun-2016', 35, 877);
INSERT INTO TBLTESTAUM VALUES (1234, '20-Jun-2016', 37, 877);
INSERT INTO TBLTESTAUM VALUES (1234, '02-Jul-2016', 39, 122);
INSERT INTO TBLTESTAUM VALUES (1234, '28-Jul-2016', 40, 122);
INSERT INTO TBLTESTAUM VALUES (1234, '31-Jul-2016', 41, 311);
INSERT INTO TBLTESTAUM VALUES (1234, '10-Aug-2016', 42, 311);
INSERT INTO TBLTESTAUM VALUES (1234, '18-Aug-2016', 44, 110);
INSERT INTO TBLTESTAUM VALUES (1234, '20-Aug-2016', 45, 110);
请注意:
- 2015 年 7 月 20 日在第一个插入中。
- Seq 字段可能有也可能没有每个值。它可能缺少一些。如果你想使用它。
- Not Nullable for Sequence 是可忽略的。
所以滚动 13 个月给了我 22/07/2015,截至今天。
我希望在每周的“CLASS”情况下将其分解,如果该周不存在任何内容,则为最后应用的 CLASS。如果没有最后一个实例,即它是第一个实例,则接下来应用 CLASS。直到 CLASS 改变。
输出为 -
Order Num WeekDate CLASS
123 27-Jul-15 459
123 3-Aug-15 459
123 10-Aug-15 459
123 17-Aug-15 459
123 24-Aug-15 459
123 31-Aug-15 459
123 7-Sep-15 459
Dates and Order Num to continue till next match in TBLTESTAUM is found
123 20-Jun-16 877
123 27-Jun-16 122
123 4-Jul-16 122
123 11-Jul-16 122
123 25-Jul-16 311
123 1-Aug-16 311
123 8-Aug-16 311
123 15-Aug-16 110
123 22-Aug-16 110
有多个订单号。但我希望你的代码适合所有。 请注意
它需要汇总到每周状态。
需要进行每月状态。但希望我能从你的代码中弄清楚这一点。
提前谢谢你。
PS:接下来的 10 小时内我将无法查看您的回复。男人要睡觉了。但非常感谢您花在这方面的任何时间。
【问题讨论】:
-
同时向我们展示预期的结果,以及您之前使用过的查询。
-
您认为为什么需要横向连接 (
cross apply)? -
@jarlh 我正在一块一块地做。由于某种原因,超链接格式错误。它给了我错误,说代码格式错误。
-
问题...
weekdate总是星期一?或者它总是与“今天的日期”在一周中的同一天(如果我在星期四运行,是否都是weekdate的星期四?)然后 - 我确实没有通知 20/Jul /2015 在第一个插入中,你是什么意思?此外,您在输入中的订单号是 1234,但在输出中是 123 - 这是拼写错误吗?然后:我看到在星期一,课程是从星期一开始的那一周开始的,而不是从前一周开始的。这没关系,也很清楚。如果同一周有两行或多行怎么办 - 应该显示什么,该周的第一个或最后一个 CLASS? -
@seewe - 是的,这应该是您需要触摸的唯一部分(如果您已经删除了最外面的
select中的“-6”)。这也会容易得多 - 只需使用trunc(add_months(sysdate, -(level - 1), 'mm'))即可 - 一次让你回到一个月。不需要所有这些算术计算。