1

dateemployeeID(int) 、およびShiftWorked(夜/日/週末または夕方)を含むテーブルがあります。従業員と日付の組み合わせごとに行があります

名簿期間の各日付の前後の 1 週間に夜勤を行った人数をカウントするクエリを作成したいと考えています。

--------------------------------------------------------------------------
Date (yyyy-MM-dd)     | CountOfNightshifts(for 1 week either side of date)
--------------------------------------------------------------------------

2012-1-1              |  8
2012-1-2              |  12
2012-1-3              |  11
2012-1-4              |  6 
etc                   |  etc

これが明確であることを願っています。これを機能させるために何日も費やしましたが、どこにも行きません。

例えば:

SELECT COUNT(id), [date]
FROM ROSTER
WHERE Shift = night AND [date] BETWEEN DATEADD(D,-7,[date]) AND DATEADD(d,7,[date])
GROUP by [date]
group by [date]

これにより、日付のリストとその特定の日の夜の数が表示されます。日付の前後の 7 日間のすべての夜勤ではありません。

4

3 に答える 3

1

次のクエリは、2つの列を返します。参照(名簿)の日付と、参照日の7日前から7日後までの夜のふるい分けに取り組んだ(異なる)人の数です。

SELECT tmain.date,
(
    SELECT COUNT(DISTINCT taux.employeeId)
    FROM roster taux
    WHERE taux.shiftWorked = 'night'
      AND taux.date >= DATEADD(DAY, -7, tmain.date)
      AND taux.date <= DATEADD(DAY, 7, tmain.date)
) AS [number_of_distinct_people_with_night_shift]
FROM roster tmain
ORDER BY tmain.date;

注1:通常、私はサブクエリよりも結合を好みますが、このソリューションの方が読みやすいと思います。

注2:日付値の時間コンポーネントは無関係であり、すべての日付が同じ時刻(つまり、「00:00:00.00」)であると想定しています。そうでない場合は、日付の比較でさらに調整を行う必要があります。

于 2012-04-24T11:42:01.497 に答える
1

これはどう?

SELECT
    [date]
    ,count(*)
FROM
    Shifts as s
WHERE 
    s.Date > DATEADD(day,-7,GETDATE())
    AND ShiftWorked = 'Night'
GROUP BY 
    date

http://sqlfiddle.com/#!3/e88cc/1

もう少しデータ:

http://sqlfiddle.com/#!3/b7793/2

特定の日付のみに関心がある場合は、次を使用できます。

DECLARE @target datetime
SET @target = GETDATE()

SELECT
    count(*) as NightShifts
FROM
    Shifts as s
WHERE 
    ShiftWorked = 'Night'
    AND s.Date > DATEADD(day,-7,@target)
AND s.Date < DATEADD(day,7,@target) 

http://sqlfiddle.com/#!3/b7793/20

ただし、実際に期間が含まれる別のテーブルがある場合 (請求日や給与日など):

DECLARE @target datetime
SET @target = GETDATE()

SELECT
p.periodDate
    ,count(*)
FROM
    Shifts as s
INNER JOIN periods as p
    ON s.date > dateadd(day,-7,p.periodDate)
        AND s.date < dateadd(day,7,p.periodDate)
WHERE 
    ShiftWorked = 'Night'
GROUP BY p.periodDate

http://sqlfiddle.com/#!3/fc54d/2

または、夜勤が行われなかったときに ) を取得するには:

SELECT
    p.periodDate
    ,ISNULL(t.num,0) as nightShifts
FROM
    periods as p    
    LEFT OUTER JOIN (
        SELECT
            p.periodDate
            ,count(*) as num
        FROM
            Shifts as s
            INNER JOIN periods as P
                ON s.date > dateadd(day,-7,p.periodDate)
                AND s.date < dateadd(day,7,p.periodDate)
        WHERE 
            ShiftWorked = 'Night'
        GROUP BY p.periodDate
      ) as t
           ON p.periodDate = t.periodDate

http://sqlfiddle.com/#!3/fc54d/11

于 2012-04-24T09:57:59.627 に答える
0

ROSTER テーブルをそれ自体に結合することで、それを引き出すことができます。これにより、従業員および日ごとに複数の結果行が作成されます。それ以外の場合、GROUP BY 句は、後の期間の結果の行を元のテーブルの日付にグループ化します。

SELECT
    r.[date],
    COUNT(period.id)
FROM ROSTER r
JOIN ROSTER period
    ON period.employeeID=r.employeeID
    AND period.shift = night
    AND r.[date] BETWEEN DATEADD(d,-7,period.[date]) and DATEADD(d,7,period.[date])
WHERE
    r.shift = night
GROUP BY r.[date]
于 2012-04-24T10:26:38.833 に答える