2016-04-18 8 views
1

Ich bin relativ unerfahren in SQL und habe eine Abfrage, die ich in SQL-Server ausführen möchte.SQL Query - Nach Namen gruppieren und Besuche nach Wochentag anzeigen

So habe ich zwei Tabellen:

Seiten:

Id (PK) | SiteName 

und Besucher:

Id (PK) | Duration | EntryTime | site_Id (FK > Sites) 

ich eine Tabelle als Ausgabe dieser Abfrage erstellen möchten, die wie folgt aussieht:

SiteName | MondayVisitCount | TuesdayVisitCount | etc... 

Ich möchte an jedem Wochentag eine Gesamtzahl der Besuche anzeigen, indem Sie das Feld "Eintragszeit" aus der Tabelle "Besuche" zusammen mit dem mit den Besuchen verknüpften Websitenamen verwenden. Die letzte Abfrage sollte einen Datumsbereich implementieren, also sind es die kumulativen Besuche an jedem Wochentag in diesem Zeitraum. Es ist der Prozess der Erstellung dieser neuen Tabelle, die ich nicht verstehe, irgendwelche Tipps willkommen.

+0

Ich denke, das Ihre Anfrage beantworten. http://stackoverflow.com/questions/15745042/efficiently-convert-rows-to-columns-in-sql-server Vielen Dank – BlueSky

+1

@BlueSky Ihr Link verweist auf, was scheint, eine zufällige Frage mit Pivot zu sein. Ich sehe keine Beziehung zu der Frage, außer mit Pivot –

Antwort

0

@jonny

ich nicht korrekte Daten zu testen, aber Sie können Ihr Ziel durch wenig Veränderung auf meiner Anfrage erreichen.

SELECT S.SITENAME AS SITENAME, 
CASE WHEN DATENAME(DW, V.EntryTime) = 'Monday' THEN 0 ELSE 1 END AS 'MondayVisitCount ', 
CASE WHEN DATENAME(DW, V.EntryTime) = 'Tuesday' THEN 0 ELSE 1 END AS 'TuesdayVisitCount ', 
FROM SITES AS S 
INNER JOIN VISITS AS V ON S.SITE_ID = V.SITE_ID 
+0

Danke für den Kommentar. Wie würde ich also den Wert von "MondayVisitCount" in die Zählung (*) von Besuchen an diesem Tag während des Zeitraums einbeziehen? Momentan ist es entweder 1 oder 0. – JonnyKnottsvill

+0

Ja, du hast Recht, ich überprüfe nur, ob die Eingabezeit an welchem ​​Wochentag ist. Aber um die Gesamtzählung zu erhalten, musst du count (v.EntryTime) für jeden Fall auf 0 setzen. Ich weiß nicht, ob es richtig ist oder nicht. aber es hilft dir sicher .. – Bharat

0
DECLARE @T TABLE 
(
    SiteID INT, 
    SiteName VARCHAR(100), 
    MondayVisitCount Int, 
    TuesdayVisitCount Int, 
    WednesdayVisitCount Int, 
    ThursdayVisitCount Int, 
    FridayVisitCount Int, 
    SaturdayVisitCount INT, 
    SundayVisitCount Int 
) 


INSERT INTO @T 

     ( 
      SiteID, 
      SiteName , 
      MondayVisitCount , 
      TuesdayVisitCount , 
      WednesdayVisitCount , 
      ThursdayVisitCount , 
      FridayVisitCount , 
      SaturdayVisitCount , 
      SundayVisitCount 
     ) 
SELECT ID, SiteName 
FROM Sites 


SELECT COUNT(*) AS N, Site_Id, DATEPART(weekday, EntryTime) AS [DayOfWeek] 
INTO #tmpVisits 
FROM [dbo].Visits WITH (NOLOCK) 
--DATE FILTER GOES HERE 
GROUP BY DATEPART(weekday, EntryTime), Site_Id 

UPDATE @T 
SET SundayVisitCount = tVisits.N 
FROM @T AS tResult 
INNER JOIN #tmpVisits AS tVisits ON tVisits.Site_Id = tResult.Id AND tVisits.[DayOfWeek] = 1 

UPDATE @T 
SET MondayVisitCount = tVisits.N 
FROM @T AS tResult 
INNER JOIN #tmpVisits AS tVisits ON tVisits.Site_Id = tResult.Id AND tVisits.[DayOfWeek] = 2 
--. 
--. 
--. 
--. 
UPDATE @T 
SET SaturdayVisitCount = tVisits.N 
FROM @T AS tResult 
INNER JOIN #tmpVisits AS tVisits ON tVisits.Site_Id = tResult.Id AND tVisits.[DayOfWeek] = 7 


SELECT * 
FROM @T 

DROP TABLE #tmpVisits 
0
declare @startdate datetime = cast('2008/01/01' as datetime) 
declare @enddate datetime = cast('2008/07/31' as datetime) 

select p.* 
     into sitevisits   --create a permanent table in database 
from 
(
select 1 as rectype,s.sitename , datename(DW,v.entrytime) as [Dayofweek], 
     1 as [dayofweekcount] --give pivot something to sum 
from @site s 
join @visits v on v.siteid = s.id 
where v.entrytime between @startdate and @enddate 

) s 
pivot (sum(s.dayofweekcount) for s.[dayofweek] in ([Monday],[Tuesday],[Wednesday],[Thursday],[Friday],[Saturday],[Sunday])) p 
union 
select p.* from 
(
select 2 as rectype,'Grand Total' sitename, datename(DW,v.entrytime) as [Dayofweek], 
     1 as [dayofweekcount] 
from @visits v 
where v.entrytime between @startdate and @enddate 
) s 
pivot (sum(s.dayofweekcount) for s.[dayofweek] in ([Monday],[Tuesday],[Wednesday],[Thursday],[Friday],[Saturday],[Sunday])) p