【问题标题】:Grouping by day from 2 tables从 2 个表按天分组
【发布时间】:2009-10-06 21:48:51
【问题描述】:

我有 2 个表:“订单”和“访问”。在订单表中,我保存了有关订单的一些详细信息,包括“userIP”和“orderDate”。在访问表中,每次用户访问我的网页时,我都会保存详细信息,包括“userIP”和“visitDate”。我正在使用 ASP.NET 和 SQL SERVER 2005。 我想创建一个统计表,我保存了访问的用户数量和订购 BOTH GROUPED BY DAY 到目前为止的用户数量:

  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)

这很好用,给我按天分组的订单数量, 但是我如何将按天分组的总访问次数添加到此?

【问题讨论】:

  • 您的订单和访问表如何相互关联?
  • @Raj 更多 - 这应该是这样的链接:orders.userIP = visit.userIP AND orders.dateadd(dd, datediff(dd, 0, orderDate),0) = visit.dateadd(dd , datediff(dd, 0, visitDate),0)

标签: sql sql-server sql-server-2005 tsql


【解决方案1】:

我会这样做:

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

如果你不需要按用户IP分组,你可以这样做:

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

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

    • @najmeddine - O.orderDate = V.visitDate 这不起作用。您只需要使用日期加入(没有时间)。
    • 这个解决方案给了我一个没有意义的笛卡尔积。
    • 抱歉,我注意力不集中。现已修复。
    猜你喜欢
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多