2

こんにちは、私のコードについて少し助けが必要です。ほぼ正しいのですが、ちょっとした問題が 1 つだけあります。

結果には 3 つの列があります。

  • entries_per_weekこれは毎週新しいエントリを取得するため、ある週に 5 件、次の週に 3 件、次の週に 8 件というように続きます。
  • total_entriesこれは毎週の合計エントリを追跡するため、「entries_per_week」列を追加し続けます。
  • 次に、6WK_total過去 6 週間の合計を合計します。

したがって、基本的に の 6 を合計しprevious_total_entriesます。私はほとんどそれを機能させていますが、新年の初めに6WK_total、前年のエントリを合計するのではなく、その年から新しく開始します。

これが私のコードです:

SELECT a.*
 , sum(b.total_entries) 6WK_total
FROM 
 ( SELECT x.*
        , SUM(y.entries_per_week) total_entries
     FROM
        ( SELECT YEARWEEK(date_created) week_created
               , COUNT(*) entries_per_week
FROM entries
           GROUP 
              BY week_created
        ) x
     JOIN   
        ( SELECT YEARWEEK(date_created) week_created
                 , COUNT(*) entries_per_week
FROM entries
             GROUP 
                BY week_created
        ) y
       ON y.week_created <= x.week_created

    GROUP
       BY x.week_created
 ) a

JOIN
 ( SELECT x.*
        , SUM(y.entries_per_week) total_entries
     FROM
        ( SELECT  YEARWEEK(date_created) week_created
               , COUNT(*) entries_per_week
FROM entries
           GROUP 
              BY week_created
        ) x
     JOIN   
        ( SELECT YEARWEEK(date_created) week_created
                 , COUNT(*) entries_per_week
FROM entries
             GROUP 
                BY week_created
        ) y
       ON y.week_created <= x.week_created

    GROUP
       BY x.week_created
 ) b
  ON b.week_created BETWEEN a.week_created - (6 - 1) AND a.week_created

GROUP
BY week_created;

そして、何が起こるか、ここにいくつかの結果があります。凝視された (**) 結果に注意してください。私の望ましい結果は、他の表の下にあります。248 ではなく、以下の目的の結果テーブルのように 1056 にする必要があります。

  +--------------+-------+-----------------------+-----------+
  | week_created | total | total_entries         | 6WK_total |
  +--------------+-------+-----------------------+-----------+
  |       201149 |     49| 131                   |       243 |
  |       201150 |     37| 168                   |       411 |
  |       201151 |     37| 205                   |       614 |
  |       201152 |     18| 223                   |       837 |
**|       201201 |     25| 248                   |       248 |**
  |       201202 |     33| 281                   |       529 |
  |       201203 |     66| 347                   |       876 |
  |       201204 |     70| 417                   |       1293|
  |       201205 |     61| 478                   |       1771|
  |       201206 |     88| 566                   |       2337|
  |       201207 |     72| 638                   |       2727|
  |       201208 |     72| 710                   |       3156|
  |       201209 |     67| 777                   |       4030|
  +--------------+-------+-----------------------+-----------+

望ましい結果、week_create '201206' で注意してください。6 週間の合計は、total_entries の前の 6 つの結果になるため、566 + 478 + 417 + 347 + 281 + 248 = 2337 になります。

+--------------+-------+-----------------------+-----------+
| week_created | total | total_entries         | 6WK_total |
+--------------+-------+-----------------------+-----------+
|       201149 |     49| 131                   |       243 |
|       201150 |     37| 168                   |       411 |
|       201151 |     37| 205                   |       614 |
|       201152 |     18| 223                   |       837 |
|       201201 |     25| 248                   |       1056|
|       201202 |     33| 281                   |       1256|
|       201203 |     66| 347                   |       1472|
|       201204 |     70| 417                   |       1127|
|       201205 |     61| 478                   |       1989|
|       201206 |     88| 566                   |       2337|
|       201207 |     72| 638                   |       2727|
|       201208 |     72| 710                   |       3156|
|       201209 |     67| 777                   |       4030|
+--------------+-------+-----------------------+-----------+

ありがとう

4

1 に答える 1

0

あなたが書いたすべてに従っているかどうかはわかりませんが、そうであれば、週を抽出するために使用している YEARWEEK 関数に問題があるようです。

上記の例で何が起こっているかを次に示します。YEARWEEK 関数を 2012 年の最初の週に適用すると、「201201」に解決されますが、YEARWEEK 関数を 2011 年の最後の週に適用すると、「201153」になります。1 年は 100 週間ではないため、前月は 201199 ではなく 201153 であるため、クエリの最後の between 句は年の初めに失敗します。

週を追加したフィールドを日付形式のままにし、外側のクエリで YEARWEEK 関数のみを適用する場合は、DATE_SUB() 関数を使用して週の減算を行うことができます。のように見えるかもしれませんBETWEEN DATE_SUB(week_created, INTERVAL 5 WEEK) AND week_created

于 2012-06-12T21:27:36.500 に答える