sql >> Database >  >> RDS >> Sqlserver

SQL Server om te tellen hoe vaak een waarde tussen meerdere datumbereiken voorkomt en te vergelijken met voorgaande weken

Ik denk dat dit je kan geven wat je zoekt:

;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

Ook als Balance een varchar is, doet u meer conversies dan nodig is in uw verstrekte code. Dit geeft urenlang resultaat met minder code:

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



  1. Kan ik een mysql Select, Update en Delete in één query doen?

  2. Slaapstand en database met meerdere tenants met behulp van schema's in PostgreSQL

  3. SQL Server COALESCE() uitgelegd

  4. Postgis / Geodjango:Kan PostGIS-versie voor database niet bepalen