2016-09-22 91 views
0

我收到了一個訪客表。 訪問者具有以下的列:每天選擇多個COUNT

標識

的StartTime(日期)

購買(布爾)

發貨(布爾)

對於每個在過去的7天內天,我想選擇誰有一天,遊客的3算作開始時間

  • 遊客總量
  • 其中購買 =真
  • 計遊客總數的計數的計數遊客總數在那裏發貨 =真正的

理想的情況下,返回的結果將是:

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([開始時間])' – 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()) 

,並添加GROUP BY DAY作爲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 

此查詢不會考慮([開始時間])日期的時間組件。

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子句應取得成果更快:

WHERE [StartTime] between dateadd(day,-7,cast(GETDATE() as date)) and dateadd(day,-1,cast(GETDATE() as date))