1

これはDATABASEの人にとってはばかげた質問かもしれませんが、DATABASEを見るのは初めてなので、私にとっては非常に難しい質問です。私はDATABASEの人ではありませんが、これを行う必要があります。

SQL SERVER 2005にDATABASEがあり、オフィスの従業員の出入りに関連するデータを含むVIEWがあります。

ここに画像の説明を入力してください

特定の日付で1日に2つ以上のエントリがある場合がありますが、1日の最初のエントリはオフィスに間に合い、最後のエントリはオフィスからのアウトタイムと見なされます。時間の問題ですが、1日の最初と最後のエントリのみを考慮します。

だから私はこれのためにQUERYを書かなければなりません...

編集 :

他のいくつかの列もありますが、ここで説明する必要はないと思います。

  • CardSrNo
  • 苗字
  • ファーストネーム
  • MidleName
  • 個人ID
  • 日にち
  • 時間
  • YMD
  • HMS
  • カード番号
  • デパートメント
4

3 に答える 3

1

古き良きものを試してみてくださいgroup by

Select employeeID, Date,
    MIN(Time) as InTime, 
    MAX(Time) as OutTime
FROM Transactions
GROUP BY employeeID, Date
于 2013-02-27T06:59:30.943 に答える
0

今私はそのクエリを使用しています:

SELECT FirstName,LastName,CardNumber,Department, Date , MIN(Time) AS intime , MAX(Time) AS outtime ,
convert(varchar(8),(convert(datetime,MAX(Time),110) - convert(datetime,MIN(Time),110)),108) AS Duration
FROM CARDENTRYEXITTRANSACTIONVIEW
GROUP BY FirstName, Date,LastName,CardNumber,Department

そして、それは完璧な結果をもたらします...........。

于 2013-03-01T05:17:18.113 に答える
0

ROW_NUMBER()ランキング関数を使用して、初回および前回のエントリを決定できます。

  ;WITH cte AS
 (                             
  SELECT *, ROW_NUMBER() OVER(PARTITION BY PersonalID ORDER BY [Date] ASC, [Time] ASC) AS rnASC,
            ROW_NUMBER() OVER(PARTITION BY PersonalID ORDER BY [Date] DESC, [Time] DESC) AS rnDESC
  FROM dbo.your_tableName
  )
  SELECT *
  FROM cte
  WHERE rnASC = 1 OR rnDESC = 1

SQLFiddleの簡単な例

または、 EXISTS演算子でオプションを使用します

SELECT *
FROM dbo.your_tableName t1
WHERE EXISTS (
              SELECT 1
              FROM dbo.your_tableName t2
              WHERE t1.PersonalID = t2.PersonalID
              HAVING (t1.[Date] = MAX(t2.[Date]) AND t1.[Time] = MAX(t2.[Time]))
                OR (t1.[Date] = MIN(t2.[Date]) AND t1.[Time] = MIN(t2.[Time]))
              )

SQLFiddleの簡単な例

于 2013-02-27T07:39:13.823 に答える