【问题标题】:MSSQL - How to divide each month into 4 weeks?MSSQL - 如何将每个月分为 4 周?
【发布时间】:2017-06-23 20:22:39
【问题描述】:

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

    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。

【问题讨论】:

    标签: sql-server-2008 pivot week-number datepart


    【解决方案1】:

    你可以使用返回月份日期的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) 我必须在 SELECT 和 GROUP BY 中都使用 CASE 吗? (据我所知,这在 MS SQL 中是必要的。) 2)有没有办法优化这个查询以获得更好的性能?
    【解决方案2】:

    如果您想在 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-23
      • 2017-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      • 1970-01-01
      • 2021-06-15
      相关资源
      最近更新 更多