2009-10-06 41 views
0

我有2个表格:“订单”和“访问”。在订单表中我保存了一些关于订单的细节,包括“userIP”和“orderDate”。在访问表中,我每次访问包含“userIP”和“visitDate”的我的网页时都会保存详细信息。我使用ASP.NET和SQL Server 2005 我想创建一个统计表whitin我省访问的用户数和有序BOTH GROUPED一天到目前为止,我得到了用户的数量:从2个表格中按天分组

select count(userIP) as NumOfOrders, 
     dateadd(dd, datediff(dd, 0, orderDate),0) as Date 
    from Orders 
group by dateadd(dd, datediff(dd, 0, orderDate), 0) 

这工作得很好,并给我按天分组的订单数量, ,但我如何将按天分组的总访问量添加到此?

+0

您的订单和访问表如何链接到对方? – 2009-10-06 21:55:49

+0

@Raj更多 - 这应该链接像这样︰orders.userIP = visits.userIP AND orders.dateadd(dd,datediff(dd,0,orderDate),0)= visits.dateadd(dd,datediff(dd,0, visitDate),0) – Novitzky 2009-10-06 22:14:42

回答

0

我这样做:

SELECT v.userIP, NumOfVisits, NumOfOrders, v.Date 
FROM (
    SELECT userIP, count(*) as NumOfVisits, 
     dateadd(dd, datediff(dd, 0, visitDate),0) as Date 
    FROM visits 
    GROUP BY userIP, dateadd(dd, datediff(dd, 0, orderDate), 0)) v 
LEFT JOIN (
    SELECT userIp, count(*) as NumOfOrders, 
     dateadd(dd, datediff(dd, 0, orderDate),0) as Date 
    FROM orders 
    GROUP BY UserIP, dateadd(dd, datediff(dd, 0, orderDate), 0)) o 
ON o.UserIP = v.UserIP 
    AND o.Date = v.Date 

和你的结果应该是这样的:

78.34.5.11 | 3 | 1 | 2009.10.06 
78.34.5.19 | 9 | 0 | 2009.10.06 

,如果你不通过USERIP需要组,你可以这样做:

SELECT NumOfVisits, NumOfOrders, v.Date 
FROM (
    SELECT count(*) as NumOfVisits, 
     dateadd(dd, datediff(dd, 0, visitDate),0) as Date 
    FROM visits 
    GROUP BY dateadd(dd, datediff(dd, 0, visitDate), 0)) v 
LEFT JOIN (
    SELECT count(*) as NumOfOrders, 
     dateadd(dd, datediff(dd, 0, orderDate),0) as Date 
    FROM orders 
    GROUP BY dateadd(dd, datediff(dd, 0, orderDate), 0)) o 
ON o.Date = v.Date 

您的结果将如下所示:

12 | 1 | 2009.10.06 
0
SELECT COALESCE(O1.Date, V1.Date) Date, 
     COALESCE(O1.NumOfOrders, 0) NumOfOrders, 
     COALESCE(V1.TotalVisits, 0) TotalVisits 
FROM 
    (select dateadd(dd,0, datediff(dd, 0, O.orderDate)) Date, 
      count(O.userIP) NumOfOrders 
     from Orders O 
    group by dateadd(dd,0, datediff(dd, 0, O.orderDate))) O1 
FULL JOIN 
    (select dateadd(dd,0, datediff(dd, 0, V.visitDate)) Date, 
      count(V.userIP) TotalVisits 
     from Visits V 
    group by dateadd(dd,0, datediff(dd, 0, V.visitDate))) V1 
on O1.Date = V1.Date 
+0

@najmeddine - O.orderDate = V.visitDate这是行不通的。你只需要加入使用日期(没有时间)。 – Novitzky 2009-10-06 22:11:39

+0

你是对的,谢谢。 – manji 2009-10-06 22:24:59

+0

这个解决方案给了我一个没有道理的笛卡尔产品。 – tone 2009-10-07 07:29:53