2016-04-18 12 views
1

私は比較的SQLで経験が不十分で、SQL-Serverで実行したいクエリがあります。次のように私に見えるこのクエリからの出力としてテーブルを作成したいSQLクエリ - 名前でグループ化し、曜日別に訪問します。

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

サイト:

Id (PK) | SiteName 

と訪問

は、だから私は2つのテーブルを持っている

SiteName | MondayVisitCount | TuesdayVisitCount | etc... 

訪問に関連付けられたサイト名に伴う訪問テーブルのEntryTimeフィールドを使用して、週の各曜日に合計訪問カウントを設定します。最終的なクエリでは日付範囲を実装する必要があるため、その日付範囲の各曜日の累積訪問数です。それは私が理解していないこの新しいテーブルを作成するプロセスです、ヒントは歓迎します。

@jonny

+0

私は、これはあなたのクエリにお答えしますね。 http://stackoverflow.com/questions/15745042/efficiently-convert-rows-to-columns-in-sql-server – BlueSky

+1

@BlueSkyあなたのリンクは、ピボットを使用してランダムな質問であると思われる点を指しています。私はピボットを使用する以外は、質問に関係があることはわかりません –

答えて

0

私がテストするために、適切なデータを持っていけない、しかし、あなたは私のクエリに変更する少しによってあなたの目標を達成することができます。

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

コメントありがとうございます。 「MondayVisitCount」の値を、その日のその日の訪問数(*)にどのようにしたらいいですか?現在、それは明らかに1または0です。 – JonnyKnottsvill

+0

はい、あなたは正しいです、私はちょうどentrytimeがweek.Butの総数を得るためにあなたがcount(v.EntryTime)を0にする必要があるかどうかをチェックします。私はそれが正しい方法であるかどうかわからない。それは確かにあなたを助ける.. – 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 
関連する問題