2016-09-22 6 views
0

私は訪問者のテーブルを持っています。毎日複数のCOUNTを選択

同上

のStartTime(日)

購入(ブール値)

出荷(ブール値)

それぞれの場合: ビジターには、次の列があります最後の7日以内に1日日は、私はその日を持っている訪問者の3つのカウントを選択したいのStartTime として:

  • 総来場者
  • =真
  • 数を購入し、総来場者の数をカウント真出荷総来場者=の

は、理想的には、返される結果は次のようになります。

Day Total TotalPurchased TotalShipped 
1  100  67    42 
2  82  61    27 
etc... 

私は.NET Linqに慣れていますので、これは私にとって大きな課題であることが判明しています。

私は今のところ出ているすべては、次のとおりです。

SELECT COUNT(*) AS Total 
FROM [dbo].[Visitors] 
WHERE DAY([StartTime]) = DAY(GETDATE()) 

誰かができれば、それは素晴らしいことと思いますので、しかし、私は今、かなり立ち往生感じ、うまく現在の日の合計を選択正しい方向に私を向ける。

+0

'GROUP BY DAY([のStartTime])を行い' – jarlh

+0

を、私はこれがためであると思いますSQLサーバー?それに応じてDBMSにタグを付けることができますか? –

+0

使用CASE + SUM() – ajeh

答えて

1

最後の7日間は、スタニスラフによって提案されたクエリを使用するためにこのWHERE

SELECT DAY([StartTime]) theDay, 
      COUNT(*) AS Tot, 
      SUM(CASE WHEN Purchased=true THEN 1 ELSE 0 END) as TotPurch,  
      SUM(CASE WHEN Shipped=true THEN 1 ELSE 0 END) as TotShip 
    FROM [dbo].[Visitors] 
    WHERE [StartTime] BETWEEN GETDATE()-7 AND GETDATE() 
    GROUP BY DAY([StartTime]) 
0
SELECT COUNT(*) AS Total, 
     SUM(CASE WHEN Purchased=true THEN 1 ELSE 0 END) as TotalPurchased,  
     SUM(CASE WHEN Shipped=true THEN 1 ELSE 0 END) as TotalShipped 
FROM [dbo].[Visitors] 
WHERE DAY([StartTime]) = DAY(GETDATE()) 

とjarlhが

0

を述べたようにここでは、あなたがこのクエリは考慮しています

SELECT DATEDIFF(day,StartTime, getdate())+1 as [Day], -- Add 1 to display 1 to 7 instead of 0 to 6 
COUNT(*) as Total, 
SUM(CASE WHEN Purchased = 1 THEN 1 ELSE 0 END) as TotalPurchased, 
SUM(CASE WHEN Shipped = 1 THEN 1 ELSE 0 END) AS TotalShipped 
FROM Visitors 
WHERE DATEDIFF(day,startTime,GETDATE()) < 6 
GROUP BY DATEDIFF(day,startTime,GETDATE()) 
ORDER BY 1 

をしたいデータセットを与えることの単純な選択だGROUP BY DAY([のStartTime])を追加します日付の時間成分。

0

を持つテーブルが[DBO]であるので、これはおそらく、SQL Serverのデータベースに関連しています。

この場合、[購入済み]と[出荷済み]の列は、おそらくBITフィールドです。

このようなBITフィールドは、SUMとIIFまたはCASE WHENでカウントできます。
DATEDIFFを使用して過去7日間を選択できます。

SELECT 
DAY([StartTime]) as [Day], 
SUM(IIF([Purchased] = 1, 1, 0)) AS TotalPurchased, 
SUM(case when [Shipped] = 1 then 1 else 0 end) AS TotalShipped, 
COUNT(*) AS Total 
FROM [dbo].[Visitors] 
WHERE datediff(day, [StartTime], GETDATE()) BETWEEN 1 AND 7 
GROUP BY DAY([StartTime]) 
ORDER BY 1; 

そして、そのテーブルが日付フィールドにインデックス付けされている場合、句が速く結果が得られるはずです。この:

WHERE [StartTime] between dateadd(day,-7,cast(GETDATE() as date)) and dateadd(day,-1,cast(GETDATE() as date)) 
関連する問題