Guest User

Untitled

a guest
Aug 5th, 2012
23
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.73 KB | None | 0 0
  1. MySQL: AVG of defined variable per month [migrated]
  2. -- Calculate the previous order date for each order
  3. CREATE TEMPORARY TABLE Orders
  4. (
  5. OrderID INT NOT NULL PRIMARY KEY,
  6. UserID INT NOT NULL,
  7. OrderDate DATETIME NOT NULL,
  8. Year YEAR NOT NULL,
  9. Month TINYINT NOT NULL,
  10. PreviousOrderDate DATETIME
  11. )
  12. INSERT INTO Orders (OrderID, UserID, OrderDate, Year, Month, PreviousOrderDate)
  13. SELECT
  14. O2.orderid,
  15. O2.userid,
  16. FROM_UNIXTIME(O2.date) AS OrderDate,
  17. YEAR(FROM_UNIXTIME(O2.date)) AS Year,
  18. MONTH(FROM_UNIXTIME(O2.date)) AS Month,
  19. MAX(O1.date_time) AS PreviousOrderDate
  20. FROM
  21. xcart_orders AS O2
  22. LEFT JOIN xcart_orders AS O1 ON O2.userid = O1.userid AND O1.date_time < O2.date_time
  23. GROUP BY
  24. O2.orderid,
  25. O2.userid,
  26. O2.date
  27.  
  28. -- Calculate the average for each year and month
  29. SELECT
  30. Year, Month, COUNT(*) AS Orders, SUM(PreviousLogins) / COUNT(*) AS AvgPrevLogins
  31. FROM
  32. (
  33. -- Get the number of previous logins for each order
  34. SELECT
  35. O.OrderID, O.Year, O.Month, COUNT(L.userid) AS PreviousLogins
  36. FROM
  37. Orders AS O
  38. LEFT JOIN xcart_login_history AS L
  39. ON O.UserID = L.userid
  40. -- Filter logins here in the join rather than in a WHERE clause, or you exclude orders that HAVE no previous logins (in practice, such may not exist)
  41. AND L.date < O.OrderDate
  42. AND (L.date > O.PreviousOrderDate OR O.PreviousOrderDate IS NULL) -- Only count logins from after the last previous order (if one exists)
  43. AND L.status = 'success'
  44. AND L.action IN ('login', 'autologin')
  45. GROUP BY
  46. O.OrderID, O.Year, O.Month
  47. ) AS X
  48. GROUP BY
  49. Year, Month
  50. ORDER BY
  51. Year, Month
Advertisement
Add Comment
Please, Sign In to add comment