3

90 年代初頭までさかのぼって、各年の各週のジョブ数を表示するレポートを作成したいと考えています。SQL の知識があまりないため、解決できないように見える問題に遭遇しました。

mysql では、週の開始日を日曜日または月曜日に制限していることを理解しています。水曜日から火曜日までグループ化したいので、GROUP BY YEAR(JOBID), WEEK(JOBID)日曜日から始まる週にグループ化されたものだけを表示します。

私はここでこれを見つけました

SELECT
    count(jobs) as count,
    CASE WHEN (weekday(datetime)<=3) THEN date(datetime + INTERVAL (3-weekday(datetime)) DAY)
        ELSE date(datetime + INTERVAL (3+7-weekday(datetime)) DAY)
    END as dt
FROM values

しかし、それは私に同じ結果セットを与えます

SELECT 
    COUNT(jobs), 
    Week(datetime) as Week, 
    Year(datetime) as Year 
FROM jobs 
GROUP BY Year(datetime), Week(datetime)

誰かが私が間違っていることを指摘できますか?

4

2 に答える 2

1

最初のクエリは不完全で、「GROUP BY」句が含まれていません。「dt」列を定義するのと同じ「CASE」式を「GROUP BY」してください。

「GROUP BY」句が正しく記述されている限り、CASE ステートメントは正しく作成されており、求めている別の結果セットを返すはずです。

あなたのクエリを SQL Server クエリとして再構成し、自分のデータでそれらが異なる結果セットを返すことを確認しました。

目的のクエリの動作する SQL Server バージョンを次に示します。

SELECT
COUNT([jobs]) AS Count,
CASE
WHEN (DATEPART(dw, [datetime])<=3) THEN Convert(date, DATEADD(day, 3-DATEPART(dw, [datetime]), [datetime]))
ELSE Convert(date, DATEADD(day, 3+7-DATEPART(dw, [datetime]), [datetime]))
END AS WeekLabel
FROM JobsTable
GROUP BY
CASE
WHEN (DATEPART(dw, [datetime])<=3) THEN Convert(date, DATEADD(day, 3-DATEPART(dw, [datetime]), [datetime]))
ELSE Convert(date, DATEADD(day, 3+7-DATEPART(dw, [datetime]), [datetime]))
END
ORDER BY
CASE
WHEN (DATEPART(dw, [datetime])<=3) THEN Convert(date, DATEADD(day, 3-DATEPART(dw, [datetime]), [datetime]))
ELSE Convert(date, DATEADD(day, 3+7-DATEPART(dw, [datetime]), [datetime]))
END DESC

そして、他の比較クエリの SQL Server バージョン:

SELECT COUNT([jobs]),
DATEPART(week, [datetime]) AS WeekLabel,
DATEPART(year, [datetime]) AS YearLabel
FROM JobsTable
GROUP BY DATEPART(week, [datetime]), DATEPART(year, [datetime])
ORDER BY DATEPART(year, [datetime]) DESC, DATEPART(week, [datetime]) DESC
于 2012-06-25T16:30:16.917 に答える
1

最も簡単な解決策は、カレンダー テーブルを使用することです。開始日として水曜日を使用して週を簡単にカスタマイズでき、10 年間のデータは約 3650 行しかありません。

http://weblogs.sqlteam.com/dang/archive/2010/07/19/calendar-table-and-datetime-functions.aspx

http://web.archive.org/web/20070611150639/http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html

始める必要があります。

于 2012-06-25T13:27:35.930 に答える