13

私は次のものを持っています:

http://sqlfiddle.com/#!6/226ae/1

私は今、年の各週に 1 つの行を追加し、それに応じて連絡先をフィルター処理しようとしています。CONTACTS には日時列があります。新しいテーブルは次のようになります。

        Status 1    Status 2    Status 3
Week 1      3          4           2
Week 2      1          5           3
Week 3      2          2           4

DATEADD を使用する必要があると思いますが、クエリの変更を開始する方法がわかりません。

MySQL に GROUP BY WEEK コマンドがあることは知っていますが、SQL に同等のコマンドがあるとは思いません。これを達成するための最良の方法は何ですか?

4

3 に答える 3

37

DATEPART()複数の年にまたがるデータがある場合は、週と年の両方でこのグループを使用できます。

SELECT 
    'Week ' + cast(datepart(wk, created) as varchar(2)) Week,
    SUM(case WHEN status = 1 then 1 else 0 end) Status1,
    SUM(case WHEN status = 2 then 1 else 0 end) Status2,
    SUM(case WHEN status = 3 then 1 else 0 end) Status3,
    SUM(case WHEN status = 4 then 1 else 0 end) Status4,
    SUM(case WHEN status = 5 then 1 else 0 end) Status5
FROM contacts
group by datepart(wk, created), year(created)

デモで SQL Fiddle を参照してください

年を最終結果に追加します。

SELECT 
    'Week ' + cast(datepart(wk, created) as varchar(2)) Week,
    year(created) year,
    SUM(case WHEN status = 1 then 1 else 0 end) Status1,
    SUM(case WHEN status = 2 then 1 else 0 end) Status2,
    SUM(case WHEN status = 3 then 1 else 0 end) Status3,
    SUM(case WHEN status = 4 then 1 else 0 end) Status4,
    SUM(case WHEN status = 5 then 1 else 0 end) Status5
FROM contacts
group by  datepart(wk, created), year(created)

デモで SQL Fiddle を参照してください

于 2012-11-07T21:49:34.437 に答える
2

この関数を使用してdatepart、日付から週を抽出できます。

クエリは次のようになります。

SELECT datepart(week, created) as week,
  SUM(case WHEN status = 1 then 1 else 0 end) Status1,
  SUM(case WHEN status = 2 then 1 else 0 end) Status2,
  SUM(case WHEN status = 3 then 1 else 0 end) Status3,
  SUM(case WHEN status = 4 then 1 else 0 end) Status4,
  SUM(case WHEN status = 5 then 1 else 0 end) Status5
FROM contacts
group by datepart(week, created)

SqlFiddle:http ://sqlfiddle.com/#!6/226ae/6tsq

于 2012-11-07T21:46:30.173 に答える
0

クエリで group by 句を使用してみてください。

SELECT
    DATE_FORMAT( created, '%u' ) week_number,
    SUM(case WHEN status = 1 then 1 else 0 end) Status1,
    SUM(case WHEN status = 2 then 1 else 0 end) Status2,
    SUM(case WHEN status = 3 then 1 else 0 end) Status3,
    SUM(case WHEN status = 4 then 1 else 0 end) Status4,
    SUM(case WHEN status = 5 then 1 else 0 end) Status5
FROM contacts
GROUP BY DATE_FORMAT( created, '%u' )

私はあなたがmysqlについて話していると仮定しています。

DATE_FORMAT 関数はここに文書化されています:
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format

于 2012-11-07T21:39:12.067 に答える