Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

data between two dates in column for each day

I have table worker

id          name                                                                 
----------- ------------------- 
5           Артур Петрович                                         
6           Дмитрий Белов                                         
7           Казарян Артур  

and another table

id          date       amount      id_worker
----------- ---------- ----------- -----------
27          2013-09-12 1500        5
28          2013-09-12 100         6
29          2013-09-12 500         5
30          2013-09-12 500         6
31          2013-09-14 1000        7
32          2013-09-15 100         5
33          2013-09-15 200         5

I want to write stored procedure which on input gets start and end dates and on output I want to get this table if: start date:2013-09-10
end date :2013-09-15

Name            2013-09-10 2013-09-11 2013-09-12 2013-09-13 2013-09-14 2013-09-15
_______________ __________ __________ __________ __________ __________ __________
Артур Петрович           0          0       2000          0          0        300
Дмитрий Белов            0          0        600          0          0          0
Казарян Артур            0          0          0          0       1000          0
like image 350
Goko Gorgiovski Avatar asked Feb 15 '26 17:02

Goko Gorgiovski


1 Answers

The only way I konw to do this is using Dynamic SQL, IMO there is no risk of SQL Injection if the tables structures are known ahead

DECLARE @DateList VARCHAR(MAX), @DateListCoalesced VARCHAR(MAX)
SELECT @DateList = '', @DateListCoalesced = ''
;WITH DateLimits AS (
  SELECT CAST('2013-9-10' AS DATE) AS dt
  UNION ALL
  SELECT DATEADD(dd, 1, dt)
    FROM DateLimits s
   WHERE DATEADD(dd, 1, dt) <= CAST('2013-9-15' AS DATE))
SELECT @DateList =  @DateList + '[' + CAST(dt AS VARCHAR)+ '], ' ,
    @DateListCoalesced = @DateListCoalesced + ' COALESCE( [' + CAST(dt AS VARCHAR)+ '] , 0) as [' + CAST(dt AS VARCHAR)+ '], ' 
  FROM DateLimits

;SET @DateList = LEFT(@DateList, LEN(@DateList) - 1)
;SET @DateListCoalesced = LEFT(@DateListCoalesced, LEN(@DateListCoalesced) - 1)


DECLARE @query NVARCHAR(max)
SET @query = N'SELECT [Name], ' +  @DateListCoalesced +'
FROM   
    (SELECT [Name], [Date], [Amount] 
     FROM WorkerAmount
     INNER JOIN Worker ON WorkerAmount.id_worker = Worker.id
    ) p
    PIVOT
    (
        Sum ([Amount] )
        FOR [Date] IN ( '+ @DateList +' )
    ) AS pvt '

EXEC sp_executesql @Query

This answer uses a combination of few other questions

  • getting dates between range of dates
  • Pivots with dynamic columns in sql-server
  • replace null values in sql pivot
like image 160
Luis LL Avatar answered Feb 18 '26 06:02

Luis LL



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!