2017-09-26 5 views
0

J'essaie d'écrire une requête SQLite qui obtient le nombre total d'occurrences d'une valeur, divisé par mois.SQLite combiner plusieurs requêtes avec colonne partagée

Un exemple de la sortie souhaitée:

Name Jun Jul Aug Sept 
John 3 2 5 2 
Robert 4 12 45 22 
Linda 0 2 1 0 

Je veux que le champ Name seulement le retour des résultats uniques, il sera essentiellement compter chaque fois que « John » est apparu au mois de juin, juillet, etc.

Voici ce que j'ai jusqu'à présent, en utilisant ma base de données réelle. Il travaille à retourner les colonnes de droite et uniques « ReasonDetail », mais les comptes ne sont pas exacts:

SELECT * FROM 

(
    SELECT ReasonDetail AS Appetite, COUNT(*) AS June 
     FROM CallRecords 
     WHERE CallReason = 'Appetite Question' 
     AND DateTime BETWEEN '2017-06-01 00:00' AND '2017-07-01 00:00' 
     GROUP BY ReasonDetail 
), 
(
    SELECT COUNT(*) AS July 
     FROM CallRecords 
     WHERE CallReason = 'Appetite Question' 
     AND DateTime BETWEEN '2017-07-01 00:00' AND '2017-08-01 00:00' 
     GROUP BY ReasonDetail 
), 
(
    SELECT COUNT(*) AS August 
     FROM CallRecords 
     WHERE CallReason = 'Appetite Question' 
     AND DateTime BETWEEN '2017-08-01 00:00' AND '2017-09-01 00:00' 
     GROUP BY ReasonDetail 
) 
GROUP BY Appetite 

Qu'est-ce que je fais mal ici? Y a-t-il une meilleure façon de compiler les comptes appropriés dans cette situation?

Merci!

Répondre

0

Cela s'appelle l'agrégation conditionnelle. Utilisez les expressions case dans une fonction d'agrégation.

SELECT ReasonDetail AS Appetite 
,COUNT(CASE WHEN DateTime>='2017-06-01 00:00' AND DateTime<'2017-07-01 00:00' THEN 1 END) AS June 
,COUNT(CASE WHEN DateTime>='2017-07-01 00:00' AND DateTime<'2017-08-01 00:00' THEN 1 END) AS July 
,COUNT(CASE WHEN DateTime>='2017-08-01 00:00' AND DateTime<'2017-09-01 00:00' THEN 1 END) AS August 
FROM CallRecords 
WHERE CallReason = 'Appetite Question' 
GROUP BY ReasonDetail 
+0

C'est excellent et a parfaitement fonctionné. Cependant, la clause "AND" entre les paramètres DateTime est manquante. Si vous mettez à jour votre réponse, je la sélectionnerai. – Zephyr

+0

sure..j'ai raté.la réponse maintenant. –