Sql server 2008 MSSQL-如何将每个月划分为4周?

Sql server 2008 MSSQL-如何将每个月划分为4周?,sql-server-2008,pivot,week-number,datepart,Sql Server 2008,Pivot,Week Number,Datepart,我有一个接近我需要的查询: select * from ( select DATEPART (YEAR, order_date) as theYear, DATEPART (WEEK, order_date) as theWeek, SUM (order_totalPrice) as totalSales from orders_tbl where

我有一个接近我需要的查询:

    select  *
    from
    (
    select      DATEPART (YEAR, order_date) as theYear,
                DATEPART (WEEK, order_date) as theWeek,
                SUM (order_totalPrice) as totalSales
    from        orders_tbl
    where       order_date >= '01/01/2015'
    group by    DATEPART (YEAR, order_date), DATEPART (WEEK, order_date)
    ) as mySourceTable
    pivot
    (
        sum (totalSales)
        for theYear in ([2015], [2016], [2017])
    ) as myPivotTable
    order by theWeek asc
这会产生如下结果:

    Week    2015    2016    2017
    ----------------------------
    1       $999    $999    $999
    2       $999    $999    $999
    3       $999    $999    $999
但这将“周”定义为从一周中的某一天开始的7天。(我认为周一是默认的)

我真正想做的是将每个月分为4周,这样我每年将有48个“周”,如下所示:

    Day of Month    Week #
    -----------------------
    1-7             1
    8-14            2
    15-21           3
    22+             4
我的最终输出如下所示:

    Month   Week        2015    2016    2017
    ----------------------------------------
    1       1           $999    $999    $999
    1       2           $999    $999    $999
    1       3           $999    $999    $999
    1       4           $999    $999    $999
    2       1           $999    $999    $999
    2       2           $999    $999    $999
我想这样做是因为这对我们来说是最有商业意义的

如何修改上述查询以实现此目的

规定1:这是一个我在web应用程序代码中调用的查询(因此,我认为这排除了一些T-SQL内容……对吗?)是的,我可以使用web应用程序代码执行各种循环或其他操作,但有没有一种方法可以在单个SQL查询中完成这一操作


规定2:我使用的是MS SQL 2008 R2。

如果DAY函数返回月份的日期,则可以使用该函数

DAY(order_date) AS DayOfMonth
接下来,您可以建立自己的逻辑,如:

CASE WHEN DAY(order_date) >= 1 AND DAY(order_date) < 8 THEN 1 
WHEN DAY(order_date) >= 8 AND DAY(order_date) < 15 THEN 2
WHEN DAY(order_date) >= 15 AND DAY(order_date) < 22 THEN 3
ELSE 4 END AS WeekNumber
当日(订单日期)>=1且日(订单日期)<8时,则为1
当日(订单日期)>=8且日(订单日期)<15时,则为2
当日(订单日期)>=15且日(订单日期)<22时,则为3
否则4以周数结束

如果您想在Laravel将月份分为几周,以下代码可能会对您有所帮助

public function weeksOfMonth($year = null, $month)
{
    if($year == null ):
        $year = Carbon::now()->year;
    endif;
    $date = Carbon::createFromDate($year,$month);
    $j=1;
    $week_array = [];
    for ($i=1; $i <= $date->daysInMonth ; $i++) {
        Carbon::createFromDate($year,$month,$i); 
        $start_date = Carbon::createFromDate($year,$month,$i)->startOfWeek()->toDateString();
        $end_date = Carbon::createFromDate($year,$month,$i)->endOfweek()->toDateString();
        $week_array[$j]['start_date'] = $start_date;
        $week_array[$j]['end_date'] = $end_date;
        $week_array[$j]['week'] = 'week'.$j;
        $i+=7;
        $j++; 
    }
    return $week_array;
}
公共函数weeksOfMonth($year=null,$month)
{
如果($year==null):
$year=碳::现在()->年;
endif;
$date=Carbon::createFromDate($year,$month);
$j=1;
$week_数组=[];
对于($i=1;$i daysInMonth;$i++){
碳::createFromDate($year,$month,$i);
$start_date=Carbon::createFromDate($year,$month,$i)->startOfWeek()->toDateString();
$end_date=Carbon::createFromDate($year,$month,$i)->endOfweek()->toDateString();
$week_数组[$j]['start_date']=$start_date;
$week_数组[$j]['end_date']=$end_date;
$week_数组[$j]['week']='week'.$j;
$i+=7;
$j++;
}
返回$week_数组;
}

这太棒了!它给出了我想要的确切结果。两个后续问题:

1)我必须在SELECT和GROUP BY中使用该案例吗?(据我所知,这在MS SQL中是必要的。)2)是否有方法优化此查询以获得更好的性能?