次のような SQL テーブルがあります。
ID uniqueidentifier
ID_Task uniqueidentifier
ID_Employee uniqueidentifier
Comment nvarchar(256)
Complete int
Date datetime
Days decimal(6, 2)
Locked bit
Created datetime
Edited datetime
Deleted bit
私がやりたいことは、特定の ID_Employee について、日付ごとにすべての「日」を合計することです。次のようなクエリを作成することができました。
SELECT CAST([Note].Date AS DATE) As Date,
SUM([Note].Days) AS Total
FROM
Note
WHERE
[Note].ID_Employee = N'E6A0E609-F8B2-4B48-A17C-4A4E117A4077'
GROUP BY
CAST(Note.Date AS DATE)
これにより、次のような一意の「日付」ごとに合計「日」の結果セットが得られます。
2013-06-20 1.00
2013-06-21 0.75
は、従業員 E6A0E609-F8B2-4B48-A17C-4A4E117A4077 が 20 日に 1 人日、21 日に 3/4 人日働いたことを示しています。特定の従業員がさまざまな ID_Tasks でさまざまな時間働いた可能性があるため、年間の任意の日に任意の数の個々のレコードが存在する可能性があります。
今、私がやりたいことは、結果セットに別のフィールドを追加することです。それは、レコードのいずれかが「ロック」を 1 に設定した場合は「false」、それ以外の場合はすべて 0 の場合は「true」です。データベースに尋ねたいのは、「テーブル内のすべての日付について、勤務日数の合計と、その日のすべてのレコードが特定の従業員についてロックされているかどうかを教えてください」です。したがって、結果セットに表示したいのは次のとおりです。
2013-06-20 1.00 TRUE
2013-06-21 0.75 FALSE
従業員が 20 日に自分の仕事をサインオフしたことを意味し (TRUE、すべてのレコードの Locked ビットフィールドに 1 がある)、1 つ以上のレコードがまだ 21 日にサインオフしていないことを意味します。つまり、この従業員の 21 日に 1 つ以上のレコードがあります。ロックされたビットフィールドに 0 があります)。
それは理にかなっていますか?とにかく、これを行う最善の方法を理解することはできません。
支援できる SQL の天才が潜んでいますか?
編集:
OK、以下の回答から得たアイデアのおかげで、クエリに CASE 行を追加しました。基本的には、「この日付の任意のレコードのロックされた最小数がゼロの場合、すべてのレコードが承認されたわけではありません。それ以外の場合はすべて承認されています」と述べています。
SELECT CAST([Note].Date AS DATE) As Date,
SUM([Note].Days) AS Total,
CASE MIN(CONVERT(INT, Locked)) WHEN 0 THEN 0 ELSE 1 END AS Locked
FROM
Note
WHERE
[Note].ID_Employee = N'E6A0E609-F8B2-4B48-A17C-4A4E117A4077'
GROUP BY
CAST(Note.Date AS DATE)