2009-10-06 10 views
0

J'ai 2 tables: "ordres" et "visites". Dans le tableau des commandes, je garde des détails sur la commande, y compris "userIP" et "orderDate". Dans le tableau des visites, je sauvegarde les détails chaque fois qu'un utilisateur visite ma page Web, y compris "userIP" et "visitDate". J'utilise ASP.NET et SQL Server 2005. Je veux créer une table statistique whitin i enregistrer le nombre d'utilisateurs visités et le nombre d'utilisateurs qui a commandé DEUX PAR JOUR GROUPEE Jusqu'à présent, je suis arrivé:Regroupement par jour à partir de 2 tables

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) 

cela fonctionne très bien et donnez-moi le nombre d'ordres groupés par jour, mais comment ajouter le nombre total de visites groupées par jour à cela?

+0

Comment votre table Commandes et visites se lie-t-elle? –

+0

@Raj Plus - ceci devrait être un lien comme ceci: orders.userIP = visits.userIP ET orders.dateadd (dd, datediff (jj, 0, orderDate), 0) = visites.dateadd (dd, datediff (dd, 0, visitDate), 0) – Novitzky

Répondre

0

Je fais ceci:

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 

et votre résultat devrait ressembler à:

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

si vous ne avez pas besoin de groupe par userIp, vous pouvez le faire:

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 

et votre résultat ressemblera à ceci:

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 cela ne fonctionnera pas. Vous devez joindre en utilisant Date uniquement (sans temps). – Novitzky

+0

vous avez raison, merci. – manji

+0

cette solution me donne un produit cartésien qui n'a pas de sens. – tone

Questions connexes