6
votes

Comment obtenir des valeurs pour chaque jour dans un mois

Données:

1. 34
2. 10
3.  0
4.  7
...


6 commentaires

Bienvenue à So Ivar. Je pense que vous devez ajouter plus de détails sur ce que vous interrogez et comment?


Certains autres détails seraient nécessaires ... Quelle langue utilisez-vous? Quel système est-ce?


Quel est le type de votre colonne de date? Est-ce une date ou un varchar?


Je suis comme si l'OP veut faire Sélectionnez la somme (valeurs) à partir du groupe SOIT_TABLE par date; Mais d'autres informations seront effectivement utiles.


Wow. Les gens répondent vraiment vite :). J'aurais dû dire mysql dans le titre et non seulement dans les balises. La date est DateTime comme ceci: 2010-02-16 18:03:57 Pour chaque jour, il y aura des valeurs et non tous les jours a des valeurs. Les échantillons de données doivent avoir des valeurs et je voudrais également 0 pendant des jours qui n'ont aucune valeur.


Sélectionnez Somme (valeurs) à partir d'un groupe SOIT_TABLE par date; Parce que j'utilise DateTime, je devrais changer de date en jours d'abord, puis je pourrais utiliser le groupe par. Ensuite, j'aurais des valeurs pendant des jours qui ont des valeurs. Pourrais-je en quelque sorte obtenir 0 pendant des jours sans valeurs?


5 Réponses :


5
votes

Étant donné que pour certaines dates, vous n'avez aucune donnée, vous devrez remplir les lacunes. Une approche à cet égard est d'avoir une table de calendrier pré-remplie de toutes les dates dont vous avez besoin et de vous joindre à cela. Si vous souhaitez que les résultats affichent des numéros de jour comme vous l'avez montrés dans votre question, vous pouvez les prépopuler dans votre calendrier aussi comme étiquettes.

Vous rejoindrez votre champ de date de la table de données au champ Date de la table du calendrier, groupe par groupe. ce champ et les valeurs de somme. Vous voudrez peut-être spécifier des limites pour la gamme de dates couvertes.

Donc, vous pourriez avoir: xxx

requête: xxx

MISE À JOUR :

Je vois que vous avez des dateres plutôt que des dates. Vous pouvez simplement utiliser le mysql Date ( ) fonctionne dans la jointure, mais cela ne serait probablement pas optimal. Une autre approche serait d'avoir des temps de départ et de fin dans la table du calendrier définissant un «godet temporel» pour chaque jour.


0 commentaires

11
votes

Ceci est en fait étonnamment difficile à faire dans SQL. Une seule façon de le faire est d'avoir une longue énoncé de sélection avec l'Union Toutes pour générer les chiffres de 1 à 31. Cela démontre le principe, mais je suis arrêté à 4 pour plus de clarté:

1, 34
2, 10
3, 0
4, 7


0 commentaires

0
votes

Si je comprends correctement la question plutôt vague, vous souhaitez connaître le nombre d'enregistrements pour chaque date dans un délai d'un mois. Si c'est vrai, voici comment vous pouvez le faire:

SELECT COUNT(value_column) FROM table WHERE date_column LIKE '2010-01-%' GROUP BY date_column


3 commentaires

date_column n'est pas défini de temps en temps


@Ninecattorules sauf si vous êtes à partir de sept ans, je ne sais pas comment vous le sauriez. Si c'est le cas, la requête peut facilement être modifiée pour ajuster.


Dans la question "... pour chaque jour ..." et dans résultats (de OP) il y a 3. 0



1
votes

Pour obtenir de manière dynamique les dates dans une plage de dates à l'aide de SQL, vous pouvez le faire (exemple dans MySQL):

Créer une table pour contenir les chiffres 0 à 9. P>

Output
2015-01-01
2015-01-02
2015-01-03
2015-01-04
2015-01-05
2015-01-06
...
2015-05-01


0 commentaires

2
votes

Cela fonctionne pour moi ... c'est une modification d'une requête que j'ai trouvée sur un autre site. La clause "Intervalle 1 mois" garantit que je reçois les données du mois en cours, y compris les zéros pendant des jours qui n'ont aucun succès. Changez ceci en "intervalle de 2 mois" pour obtenir des données sur les derniers mois, etc.

J'ai une table appelée "charge utile" avec une colonne "horodatage" - je suis ensuite jointe à la colonne TIMESTAMP sur les dates générées de manière dynamique, la jeter que les dates correspondent à la clause ON. P>

SELECT `calendarday`,COUNT(P.`timestamp`) AS `cnt` FROM 
(SELECT @tmpdate := DATE_ADD(@tmpdate, INTERVAL 1 DAY) `calendarday`
    FROM (SELECT @tmpdate := 
        LAST_DAY(DATE_SUB(CURDATE(),INTERVAL 1 MONTH))) 
        AS `dynamic`, `payload`) AS `calendar`
LEFT JOIN `payload` P ON DATE(P.`timestamp`) = `calendarday`
GROUP BY `calendarday`


0 commentaires