sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server för att räkna hur många gånger ett värde visas mellan flera datumintervall och jämföra med tidigare veckor

Jag tror att det här kan ge dig det du letar efter:

;WITH 
weekcounts AS (
    SELECT Time_Stamp, Emp_ID, [Balance], ROUND(CONVERT(FLOAT,[Balance]) / 60.0,2) AS [Hours], DATEPART(week, Time_Stamp) AS int_week FROM newSampleData
)

,counts AS (
    SELECT Emp_ID, int_week, 1 AS int_count
    FROM weekcounts
    WHERE ([Hours] >= 7.5)
    UNION ALL
    SELECT weekcounts.Emp_ID, weekcounts.int_week, 1 AS int_count
    FROM weekcounts
        INNER JOIN counts
            ON weekcounts.Emp_ID = counts.Emp_ID
            AND (weekcounts.int_week - 1) = counts.int_week
            AND ([Hours] >= 7.5)
)

,countsagg AS (
    SELECT Emp_ID, int_week, SUM(int_count) AS int_count
    FROM counts
    GROUP BY Emp_ID, int_week
)

SELECT Emp_ID, 
       ISNULL([29],0) AS [week 29],
       ISNULL([30],0) AS [week 30],
       ISNULL([31],0) AS [week 31],
       ISNULL([32],0) AS [week 32],
       ISNULL([33],0) AS [week 33] 
FROM countsagg
PIVOT (MAX(int_count) FOR int_week IN ([29],[30],[31],[32],[33])) piv

Även om Balance är en varchar gör du fler konverteringar än vad som behövs i din kod. Detta kommer att ge resultatet i timmar med mindre kod:

ROUND(CONVERT(FLOAT,[Balance]) / 60.0,2)



  1. MySQL Välj:WHERE (tid nu) =MELLAN tabellvärde OCH tabellvärde

  2. Bästa sättet att lagra data på serversidan?

  3. Oracle datummönster till java datummönster

  4. Uppskattat antal rader som ska läsas