Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

SQL Server untuk menghitung berapa kali nilai muncul di antara beberapa rentang tanggal dan dibandingkan dengan minggu sebelumnya

Saya pikir ini mungkin memberi Anda apa yang Anda cari:

;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

Juga jika Balance adalah varchar, Anda melakukan lebih banyak konversi daripada yang dibutuhkan dalam kode yang Anda berikan. Ini akan memberikan hasil selama berjam-jam dengan lebih sedikit kode:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menambahkan beberapa variabel berparameter ke database di c#

  2. SQL Server 2008:masalah koneksi ODBC

  3. Ketika prinsip KERING tidak berlaku:operasi BITWISE di SQL Server

  4. Gabungkan banyak kolom menjadi satu, pertahankan kesamaan dan ganti perbedaan

  5. sql server 2008 - temukan tabel mana yang berisi teks tertentu