我最近的困惑是。。。我写了一个查询,显示了一段时间内每周的平均账单价值,我用周初来定义账单属于哪一周-作为一个查询它工作得很好,但我在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
2条答案
按热度按时间2ic8powd1#
你说“我用周初来定义账单的截止日期”,但我想你一定是指“我用周初来定义账单的截止日期”。
换句话说,为了将任何日期正确地分组到月份中,对于任何给定的日期,您都希望找到一周的第一天,然后找到第一天的月份。
你需要定义你想要的“一周的第一天”是什么。星期一,星期天,还是别的什么日子?这是由
@@datefirst
,并且可以使用set datefirst
假设您希望本周从星期一开始,可以使用以下方法获取任意日期@d的一周第一天:它使用的“技巧”是找出“零日期”和“零日期”之间经过了多少周
@d
,然后在零日期的基础上再加上几个星期。因为零日期是星期一,所以只有当您希望星期一是一周的开始时,它才起作用。然后可以通过将表达式 Package 到
datepart(month ...
```select datepart(month, dateadd(ww, datediff(ww, 0, @d), 0))
hgb9j2n62#
我想我已经解决了。
我添加了以下内容。。。
如果周开始日期月等于事务处理日期月减1,则使用该事务处理当月的第一天。