-1

テーブル構造は、

Table name: btq_user

name, email, kall, state_id, datain

ここで、kall = 1 または state_id in( 51, 20, 46) を持つ number レコードを毎週カウントしたいと考えています。年が変わっても毎週(月〜日)だけ結果が必要です。たとえば、2012 年 12 月 31 日が月曜日で、2013 年 6 月 1 日が日曜日だとすると、結果にはそれが週として含まれるはずです。年が変わっても、週だけで数えるべきです。

これは私が試したものですが、機能していません。

SELECT 
count( if( A.state_id = 51 or A.state_id = 20 or A.state_id = 46, A.state_id,
null  ) ) AS state_total, count( if( A.kall =1, A.kall, null ) ) AS appointment, 
CONCAT( WEEK( A.datain) , " - 
", YEAR( A.datain ) ) AS week
FROM btq_user A
GROUP BY week
ORDER BY A.datain ASC

また、結果とともに週 (31-12-2012 - 6-1-2013) を表示する可能性はありますか?

私の質問を読んでくれてありがとう。

4

1 に答える 1

3

これには 2 つの手順があります。

1 つは、week-truncate 操作が必要です。これは、DATETIMEアイテムを受け取り、前の日曜日の午前 0 時に返されます (ビジネス ルールで週が日曜日から始まる場合)。

それが適切な GROUP BY 項目になります。WEEK() / YEAR() ハックはこれには適していません。毎年の最後の/最初の週に本当に混乱します。

私の経験では、この式は、日曜日から土曜日、

  FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -1, 7))

月曜日から日曜日の週を取得するには、次の式を使用します。

  FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -2, 7))

だからあなたはこれを行うことができます。

  SELECT COUNT(whatever), SUM(whatelse),
         FROM_DAYS(TO_DAYS(event_time) -MOD(TO_DAYS(event_time) -1, 7)) as WEEKSTART,
    FROM TABLE
   GROUP BY FROM_DAYS(TO_DAYS(event_time) -MOD(TO_DAYS(event_time) -1, 7))

MySQLで週ごとにグループ化する方法は?

次に、その切り捨てられた日付に 6 日を追加する必要があります。これにより、各週の最初の日と一緒に最後の日を表示できます。

これは、ネストされたクエリを使用してそれを行う良い方法です

SELECT whats, elses, weekstart, weekstart + INTERVAL 6 DAY AS weekend
  FROM (
  SELECT COUNT(whatever) AS whats, SUM(whatelse) AS elses,
         FROM_DAYS(TO_DAYS(event_time) -MOD(TO_DAYS(event_time) -1, 7)) AS weekstart,
    FROM TABLE
   GROUP BY FROM_DAYS(TO_DAYS(event_time) -MOD(TO_DAYS(event_time) -1, 7))
  ) AS summary
ORDER BY weekstart

これをたくさんしますか?ストアドTRUNC_WEEK関数を作成することをお勧めします。

于 2013-08-17T11:58:23.307 に答える