【发布时间】:2010-11-05 21:02:04
【问题描述】:
我创建了下表(通过 UNION ALL):
ID Date Hour Weight Fiscal
AAA 1/27/2009 0 10 0
AAA 1/30/2009 0 20 0
AAA 2/14/2009 0 10 0
AAA 2/18/2009 0 20 0
AAA 2/27/2009 0 20 0
AAA 2/28/2009 0 20 0
AAA 1/14/2009 10 0 0
AAA 2/14/2009 20 0 0
AAA 2/16/2009 10 0 0
AAA 2/25/2009 10 0 0
AAA 2/26/2009 10 0 0
AAA 3/3/2009 20 0 0
NULL 0 0 0 1/28/2009
NULL 0 0 0 2/27/2009
NULL 0 0 0 3/29/2009
我想找回:
ID Date Hour Weight
AAA 1/28/2009 10 10
AAA 2/27/2009 50 50
AAA 3/29/2009 20 20
它应该首先将 DATE 列转换为下一个会计月末 FISCAL(例如 1/27/2007 -> 1/28/2009、1/30/2009 -> 2/27/2009 等)和然后按该值分组。
我可以使用:
SELECT ID
, left(CONVERT(VARCHAR(10)
, date, 111),7) as Date
, round(sum(Hours),0) as Hours
, round(sum(Weight),0) as Weight
FROM ...
GROUP BY ID
, left(CONVERT(VARCHAR(10), date, 111),7)
ORDER by ID ASC
, left(CONVERT(VARCHAR(10), date, 111),7) ASC
但这只是按 日历 日期分组,而不是根据我在 FISCAL 列中的财政月末分组。
【问题讨论】:
-
您在这里使用什么数据库引擎?您还可以发布返回第一个输出的 SQL。
-
你需要澄清这个问题。上表中的前 12 个条目的 Fiscal 为 0,那么这些日期是如何计算的?小时和重量是否与会计月份的计算有某种关联?我们是否将多行连接在一起以计算单行(例如,将多行中的 AAA 条目连接起来以确定实际的会计月份)?归结为基本问题...
-
第一步是将数据放入两个单独的表中。您希望第二个表代表会计月份,每个月份都有一个开始日期和一个结束日期。从上面的 UNION ALL 混乱中整理出来是愚蠢的 - 太像努力工作了。有了该表,分组变得非常简单;您按财政结束分组并按“日期在财政开始和财政结束之间”加入; BETWEEN/AND 的包含范围在这里非常有用。
标签: sql group-by calendar union