【发布时间】:2015-06-16 07:14:23
【问题描述】:
根据要求,我需要生成给定期间的每周报告。如果期间是同一年,则以下查询可以正常工作,但如果年份跨越两年,则同样失败。因为当年的开始周日期是从上一年开始的,这会导致记录的顺序出现问题。
电流输出
WEEK DAY FCB_ID QUANTITY_ORDERS
1 12/29/2014 1935 1
1 12/30/2014 1935 1
1 12/31/2014 1935 1
1 1/1/2015 1935 1
1 1/2/2015 1935 1
1 1/3/2015 1935 1
1 1/4/2015 1935 1
1 1 7
2 1/5/2015 1935 1
2 1/6/2015 1935 1
2 1/7/2015 1935 1
2 1/8/2015 1935 1
2 1/9/2015 1935 1
2 1/10/2015 1935 1
2 1/11/2015 1935 1
2 1 7
3 1/12/2015 1935 1
3 1/13/2015 1935 2
3 1/14/2015 1935 3
3 1/15/2015 1935 3
3 1 9
51 12/15/2014 1935 1
51 12/16/2014 1935 1
51 12/17/2014 1935 1
51 12/18/2014 1935 1
51 12/19/2014 1935 1
51 12/20/2014 1935 1
51 12/21/2014 1935 1
51 1 7
52 12/22/2014 1935 1
52 12/23/2014 1935 1
52 12/24/2014 1935 1
52 12/25/2014 1935 1
52 12/26/2014 1935 1
52 12/27/2014 1935 1
52 12/28/2014 1935 1
52 1 37
预期结果 上一年的 desc 和当年的 asc 的周数
51 12/15/2014 1935 1
51 12/16/2014 1935 1
51 12/17/2014 1935 1
51 12/18/2014 1935 1
51 12/19/2014 1935 1
51 12/20/2014 1935 1
51 12/21/2014 1935 1
51 1 7
52 12/22/2014 1935 1
52 12/23/2014 1935 1
52 12/24/2014 1935 1
52 12/25/2014 1935 1
52 12/26/2014 1935 1
52 12/27/2014 1935 1
52 12/28/2014 1935 1
1 12/29/2014 1935 1
1 12/30/2014 1935 1
1 12/31/2014 1935 1
1 1/1/2015 1935 1
1 1/2/2015 1935 1
1 1/3/2015 1935 1
1 1/4/2015 1935 1
1 1 7
2 1/5/2015 1935 1
2 1/6/2015 1935 1
2 1/7/2015 1935 1
2 1/8/2015 1935 1
2 1/9/2015 1935 1
2 1/10/2015 1935 1
2 1/11/2015 1935 1
2 1 7
3 1/12/2015 1935 1
3 1/13/2015 1935 2
3 1/14/2015 1935 3
3 1/15/2015 1935 3
3 1 9
3 1 37
查询详情
SELECT * FROM(
SELECT to_char(to_date(day),'IW') as Week, day as Day, NVL(fcb_id,1) as FCB_ID,sum(Quantity_Orders)Quantity_Orders
FROM
(
SELECT
day, fcb_id, mo_number, count(DISTINCT mo_number) Quantity_Orders
FROM report_table
WHERE fcb_id = '1111'
AND day >= TRUNC(to_date('12/15/2014', 'MM/DD/YYYY')) --[SD]
AND day <= TRUNC(to_date('1/15/2015', 'MM/DD/YYYY')) --[ED]
GROUP BY day, fcb_id, mo_number
ORDER BY fcb_id, day, mo_number
)
GROUP BY ROLLUP(to_char(to_date(DAY),'IW'), day, fcb_id)
ORDER BY to_char(to_date(DAY),'IW'), day, fcb_id
)
WHERE (FCB_ID = 1 AND DAY IS NULL) OR (FCB_ID != 1); -- this condition is used to remove extra row generated after each day due to DAY field in Rollup function
【问题讨论】:
-
您必须在 GROUP BY 中添加年份。
-
改用
to_char(to_date(day),'IYYYYIW')。 -
to_date(day)的使用是一个错误。日期列已经是 DATE 格式,因此您依赖于使用默认 nls_date_format 设置完成的额外隐式转换将其截断为一天,或者您没有明确指定格式掩码并再次依赖默认 nls_date_format 设置。如果这些应该发生变化,那么宾果游戏!错误...