2012-02-24 2 views
0

J'ai un db avec des bûches de tstamp USERNAME SUBCR_TYPE et BALANCE. Je veux savoir combien d'utilisateurs ont à chaque extrémité passé du mois un solde positif par SUBSCR_TYPECOUNT (DISTINCT à la fin du mois

Le tableau résultant devrait ressembler à ceci

  silver|gold|platinum 
2011-09  34|56 |109 
2011-10  23|43 |67 
2011-11  33|56 |45 
. 
. 
. 

J'ai essayé avec des résultats manifestement faux

SET @ts = unix_timestamp(LAST_DAY('2011-09-01')); 
SELECT COUNT(DISTINCT USERNAME) AS 'silver' 
FROM accLog_table 
WHERE BALANCE>=1 
AND SUBSCR_TYPE = 'silver' 
AND TSTAMP<@ts 

comment puis-je faire cela correctement?

+1

Ce n'est pas responsable sans plus de détails sur la sémantique de la table. Quand un enregistrement avec un solde est-il créé? Je suppose que vous voulez sélectionner le dernier enregistrement pour chaque utilisateur qui est avant la fin du mois (ce qui pourrait être dans le mois ou des années plus tôt s'il n'y a pas eu d'activité récemment), puis résumez ces enregistrements par type d'abonnement. Mais ce n'est qu'une supposition, vous devrez clarifier la question. –

+0

Votre estimation est correcte. L'enregistrement avec un solde a été créé sur l'activité. Un utilisateur peut en effet être le dernier actif il y a 8 mois et avoir encore un solde positif, il devrait donc compter 1 comme chaque mois. Je suppose que c'est exactement mon problème. Le db ne remonte que 8 mois, si cela rend les choses plus faciles. – lunacafu

+0

J'ai commencé à faire la comptabilité à chaque fin de mois, ce qui rend les choses plus faciles. J'ai juste besoin des chiffres pour les derniers mois manqués. – lunacafu

Répondre

0

Je heureux de poster une solution qui a fonctionné pour moi

 SET @ts = unix_timestamp(LAST_DAY('2011-09-01'));  
    SET @subcr = 'silver'; 
      INSERT 
      INTO monthlyLiveAccess (
       timePeriod, 
       silver 
      ) 
      SELECT DATE_FORMAT(FROM_UNIXTIME(@ts), "%Y-%m") AS timePeriod, 
       COUNT(*) AS silver FROM (
       SELECT t.* from(
        SELECT DATE_FORMAT(FROM_UNIXTIME(DATE_TIME), "%Y-%m %H:%i:%s") AS "timePeriod", 
        USERNAME, BALANCE 
        from accLog_table 
        WHERE N_BALANCE>1 
        AND DATE_TIME<@ts 
        AND SUBSCR='silver' 
       ORDER BY timePeriod desc) as t 
       GROUP BY USERNAME) AS t1 
      ON DUPLICATE KEY UPDATE silver = VALUES(silver);