2016-09-22 89 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))