SELECT MAX(DatePivot.CampaignID) CampaignID ,
MAX(DatePivot.[Date]) [Date] ,
MAX(DatePivot.[0]) [0] ,
MAX(DatePivot.[1]) [1] ,
MAX(DatePivot.[2]) [2] ,
MAX(DatePivot.[3]) [3] ,
MAX(DatePivot.[4]) [4] ,
MAX(DatePivot.[5]) [5] ,
MAX(DatePivot.[6]) [6] ,
MAX(DatePivot.[7]) [7] ,
MAX(DatePivot.[8]) [8] ,
MAX(DatePivot.[9]) [9] ,
MAX(DatePivot.[10]) [10] ,
MAX(DatePivot.[11]) [11] ,
MAX(DatePivot.[12]) [12] ,
MAX(DatePivot.[13]) [13] ,
MAX(DatePivot.[14]) [14] ,
MAX(DatePivot.[15]) [15] ,
MAX(DatePivot.[16]) [16] ,
MAX(DatePivot.[17]) [17] ,
MAX(DatePivot.[18]) [18] ,
MAX(DatePivot.[19]) [19] ,
MAX(DatePivot.[19]) [19] ,
MAX(DatePivot.[19]) [19] ,
MAX(DatePivot.[20]) [20] ,
MAX(DatePivot.[21]) [21] ,
MAX(DatePivot.[22]) [22] ,
MAX(DatePivot.[23]) [23]
FROM ( SELECT CampaignID ,
CAST(DateSent AS DATE) [Date] ,
DATEPART(HOUR, DateSent) [Hour] ,
COUNT(1) [Email Count]
FROM EmailAddresses WITH ( NOLOCK )
WHERE DateSent IS NOT NULL
AND CampaignID = 16703
GROUP BY CampaignID ,
CAST(DateSent AS DATE) ,
DATEPART(HOUR, DateSent)) AS HourlySalesData
PIVOT ( SUM([Email Count])
FOR [Hour] IN ( [0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19], [20], [21], [22], [23] )) AS DatePivot;
(4hours/5 Minutes =) 80 columns
With Starts as (Select CampaignID, Min(DateSent) as [Started] From YOURTABLE Group by CampaignID)
Select * From
(Select d.CampaignID,
'+'+Cast(DateDiff(minute,s.Started,d.DateSent)/5*5+5 as VarChar(3)) as mins
From YOURTABLE d inner join Starts s on d.CampaignID = s.CampaignID
Where d.CampaignID = @CampaignID
) x
PIVOT( count(mins) FOR mins IN ([+5],[+10],[+15],[+20],...,[+240])) AS PVTTable
select
CampaignID
, CampaignStart
, grp_5
, count(CampaignID) grp_5_count
from (
select
CampaignID, min(DateSent) over(partition by CampaignID) CampaignStart
, datediff(minute,min(DateSent) over(partition by CampaignID), DateSent) / 5 grp_5
from myTable
) d
group by
CampaignID
, CampaignStart
, grp_5
demo here: http://rextester.com/VJEZG50522
USE EmailEveryware;
IF OBJECT_ID('tempdb..#tmpPivot') IS NOT NULL
DROP TABLE #tmpPivot;
;WITH Starts
AS ( SELECT CampaignID ,
MIN(DateSent) AS [Started],
MAX(DateSent) AS [Ended]
FROM EmailAddresses WITH ( NOLOCK )
WHERE DateSent IS NOT NULL
AND CampaignID > 16702
GROUP BY CampaignID )
SELECT *
INTO #tmpPivot
FROM ( SELECT d.CampaignID ,
CONVERT(VARCHAR(10), [Started], 101) + RIGHT(CONVERT(VARCHAR(32), [Started], 100), 8) [Started],
CONVERT(VARCHAR(10), [Ended], 101) + RIGHT(CONVERT(VARCHAR(32), [Ended], 100), 8) [Ended],
'+' + CAST(DATEDIFF(MINUTE, s.Started, d.DateSent) / 5 * 5 + 5 AS VARCHAR(3)) AS mins
FROM EmailAddresses d
INNER JOIN Starts s ON d.CampaignID = s.CampaignID ) x
PIVOT ( COUNT(mins)
FOR mins IN ( [+5], [+10], [+15], [+20], [+25], [+30], [+35], [+40], [+45], [+50], [+55], [+60],
[+65], [+70], [+75], [+80], [+85], [+90], [+95], [+100], [+105], [+110], [+115], [+120],
[+125], [+130], [+135], [+140], [+145], [+150], [+155], [+160], [+165], [+170], [+175], [+180],
[+185] , [+190] ,[+195], [+200], [+205], [+210], [+215], [+220], [+225], [+230], [+235], [+240],
[+245], [+250], [+255], [+260], [+265], [+270], [+275], [+280], [+285], [+290], [+295], [+300],
[+305], [+310], [+315], [+320], [+325], [+330], [+335], [+340], [+345], [+350], [+355] ,[+360] ,
[+365], [+370], [+375], [+380], [+385], [+390], [+395], [+400], [+405], [+410], [+415], [+420],
[+425], [+430], [+435], [+440], [+445], [+450], [+455], [+460], [+465], [+470], [+475], [+480],
[+485], [+490], [+495] )) AS PVTTable;
SELECT s.Name SalesSite,
c.[Description] ,
c.Recipients ,
c.EmailRead ,c.BusinessID,
t.*
FROM Campaigns c
JOIN #tmpPivot t ON c.CampaignID = t.CampaignID
JOIN Everyware.dbo.SalesSItes s ON c.SalesSiteID = s.SalesSiteID
Do you want 288 columns?
Is there a "start hour" (e.g. the office opens at 08:00) or finish hour?(e.g. the office closes at 18:00)
could "outliers" go into single columns outside the main hours?
Can you provide a few sample rows?