2009-10-06 7 views
0

У меня есть 2 таблицы: «заказы» и «посещения». в таблице заказов я сохраняю некоторые сведения о заказе, включая «userIP» и «orderDate». в таблице посещений я сохраняю данные каждый раз, когда пользователь посещает мою веб-страницу, включая «userIP» и «visitDate». Я использую ASP.NET и SQL Server 2005. я хочу, чтобы создать таблицу статистики Whitin я сохранить число пользователей посетили и количество пользователей, упорядоченный ОБА НА ДЕНЬ сгруппированных до сих пор я получил:Группировка по дням из 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

Как ваши таблицы заказов и визитов соединяются друг с другом? –

+0

@ Raj Подробнее - это shoud будет ссылка следующим образом: orders.userIP = посещения.userIP AND orders.dateadd (dd, dateiff (dd, 0, orderDate), 0) = посещения.dateadd (dd, dateiff (dd, 0, visitDate), 0) – Novitzky

ответ

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

+0

Вы правы, спасибо. – manji

+0

Это решение дает мне декартовой продукт, который не имеет смысла. – tone

Смежные вопросы