sql-按周和月分组时如何消除重复周

of1yzvn4  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(338)

我最近的困惑是。。。我写了一个查询,显示了一段时间内每周的平均账单价值,我用周初来定义账单属于哪一周-作为一个查询它工作得很好,但我在excel/ssms中遇到了一些问题,其中一个月从上个月的一周开始。示例:2020年7月1日是从6月26日开始的一周,因此我得到6月29日的6月分录和6月29日的7月分录,这两个计费平均值通过excel/ssms图表相加。
我如何绕过这个问题,并在正确的月份内显示数据(所以七月一日是七月的第一周,而不是六月的最后一周)。
这是我的剧本。。。

select top 999999999999
Avg(net) as 'AveNet', Year, Month, [Week_Start_Date]

from
(
select
FORMAT([InvDate], 'MMM', 'en-US')+ '-' + right(year(invdate),2) as 'Month',
day(invdate) as 'Day',
datepart(yyyy,invdate) as 'Year',
datepart(week,invdate) as 'WkNum',
invdate,
DATEADD(DAY, 2 - DATEPART(WEEKDAY, invdate), CAST(invdate AS DATE)) [Week_Start_Date],
net

from DB_consolsalesview csv
where invdate > '20190930'

) daily

group by Year,Week_Start_Date, month

Order by 
Year, Week_Start_Date

结果。。。

AveNet      Year    Month   Week_Start_Date
...
1004.834000 2020    May-20  2020-04-27
864.347407  2020    May-20  2020-05-04
725.336176  2020    May-20  2020-05-11
613.252777  2020    May-20  2020-05-18
702.085128  2020    May-20  2020-05-25
634.586363  2020    Jun-20  2020-06-01
750.134166  2020    Jun-20  2020-06-08
599.930857  2020    Jun-20  2020-06-15
845.304687  2020    Jun-20  2020-06-22
897.033000  2020    Jul-20  2020-06-29
669.337812  2020    Jun-20  2020-06-29
2ic8powd

2ic8powd1#

你说“我用周初来定义账单的截止日期”,但我想你一定是指“我用周初来定义账单的截止日期”。
换句话说,为了将任何日期正确地分组到月份中,对于任何给定的日期,您都希望找到一周的第一天,然后找到第一天的月份。
你需要定义你想要的“一周的第一天”是什么。星期一,星期天,还是别的什么日子?这是由 @@datefirst ,并且可以使用 set datefirst 假设您希望本周从星期一开始,可以使用以下方法获取任意日期@d的一周第一天:

select dateadd(ww, datediff(ww, 0, @d), 0)

它使用的“技巧”是找出“零日期”和“零日期”之间经过了多少周 @d ,然后在零日期的基础上再加上几个星期。因为零日期是星期一,所以只有当您希望星期一是一周的开始时,它才起作用。
然后可以通过将表达式 Package 到 datepart(month ... ```
select datepart(month, dateadd(ww, datediff(ww, 0, @d), 0))

hgb9j2n6

hgb9j2n62#

我想我已经解决了。
我添加了以下内容。。。

case 
when Month(DATEADD(DAY, 2 - DATEPART(WEEKDAY, invdate), CAST(invdate AS DATE))) = 
Month(invdate) -1 then DATEADD(MONTH, DATEDIFF(MONTH, 0, Invdate), 0) 
else 

DATEADD(DAY, 2 - DATEPART(WEEKDAY, invdate), CAST(invdate AS DATE)) end as 
[Week_Start_Date],

如果周开始日期月等于事务处理日期月减1,则使用该事务处理当月的第一天。

相关问题