Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Aug 5th, 2012  |  syntax: None  |  size: 1.73 KB  |  hits: 12  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  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