1

従業員の毎日の合計と開始日を含むテーブルがあります。従業員が何日働いたかを確認するには、3 か月を振り返る必要があります。

これが私のSQLクエリです:

    SELECT
    EMPNO,
    CONVERT(VARCHAR(10), STARTDATE,101),
    ROW_NUMBER() OVER (ORDER BY PERSONNUM) AS 'ROWCOUNT'
    FROM EMPLOYEE
    WHERE STARTDATE BETWENN DATEADD(month, -3, GETDATE()) and GETDATE()
    GROUP BY EMPNO,STARTDATE
    ORDER BY EMPNO

結果

   EMPNO      STARTDATE               ROWCOUNT
   TEST108    09/13/2013              1
   TEST108    09/16/2013              2
   TEST108    09/17/2013              3
   TEST108    09/19/2013              4
   TEST109    09/04/2013              5
   TEST109    09/05/2013              6
   TEST109    09/06/2013              7
   TEST110    09/03/2013              9
   TEST110    09/04/2013             10
   TEST110    09/05/2013             11

望ましい結果

   EMPNO           ROWCOUNT
   TEST108         4
   TEST109         3
   TEST110         3

ありがとうございました、

4

4 に答える 4

1

この CTE をROW_NUMBERおよびで使用できCOUNT(*)OVERます。

WITH CTE AS
(
    SELECT EMPNO, STARTDATE, 
           RN = ROW_NUMBER() OVER (PARTITION BY EMPNO ORDER BY STARTDATE DESC),
           [ROWCOUNT] = COUNT(*) OVER (PARTITION BY EMPNO)
    FROM dbo.EMPLOYEE
    WHERE STARTDATE BETWEEN DATEADD(month, -3, GETDATE()) and GETDATE()
)
SELECT EMPNO, STARTDATE, [ROWCOUNT]
FROM CTE
WHERE RN = 1

DEMO

ROW_NUMBER、パーティション内のすべての行の数値を返し ( と同様GROUP BY EMPNO)、すべてを集約する必要なくすべての列を選択できます。はCOUNT(*)OVER、必要なように、各パーティションの行の合計数を返します。を使用しROW_NUMBERて重複を削除します。

于 2013-09-25T07:06:44.527 に答える