0

次のような 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)
4

1 に答える 1

1
SELECT  CAST([Note].Date AS DATE) As Date,
        SUM([Note].Days) AS Totalб
        CASE WHEN MIN(Locked) = 0 THEN 'false' ELSE 'true' END AS SignedOff
FROM
        Note
WHERE
        [Note].ID_Employee = N'E6A0E609-F8B2-4B48-A17C-4A4E117A4077'
        GROUP BY        
        CAST(Note.Date AS DATE)
于 2013-07-01T15:30:56.427 に答える