2017-02-14 4 views
1

Donc, tout ce que je veux faire est d'avoir une vue qui montre combien d'enfants entre et y compris l'âge de 5 - 18 sont dans chaque famille. J'utilise SQL Server.Exécution de COUNT() sur une colonne calculée à partir d'une VUE

La vue que je l'ai écrit pour obtenir les membres de la famille Age est

CREATE VIEW VActiveMembers 
AS 
    SELECT 
     TM.intMemberID AS intMemberID, 
     TM.strFirstName AS strFirstName, 
     TM.strLastName AS strLastName, 
     TM.strEmailAddress AS strEmailAddress, 
     TM.dtmDateOfBirth AS dtmDateOfBirth, 
     FLOOR(DATEDIFF(DAY, dtmDateOfBirth, GETDATE())/365.25) AS intMemberAge 
    FROM 
     TMembers AS TM 
    WHERE 
     TM.intStatusFlagID = 1 

intStatusFlag = 1 est juste un drapeau qui signifie que le membre est actif.

Maintenant, j'ai essayé pendant environ 3 heures pour comprendre cela, mais je ne peux pas le comprendre. Voici celui où, au lieu d'essayer d'obtenir la solution d'un seul coup, j'ai essayé de faire un pas sage, mais je n'ai toujours pas obtenu le résultat que je voulais. Comme vous pouvez le voir, je n'ai pas utilisé la vue d'où j'ai calculé l'ÂGE parce que le "Identifiant Multi-pièces ne pouvait pas être lié" J'ai vu cette erreur mais je ne pouvais pas l'obtenir dans ce Cas. Idéalement, je voudrais que le comte à effectuer sur la vue au lieu de recalcul les âges tout recommencer

CREATE VIEW VActiveFamilyMembersK12Count 
AS 
    SELECT 
     TF.intParishFamilyID, 
     COUNT(DATEDIFF(DAY, dtmDateOfBirth, GETDATE())/365) AS intMemberAgeCount 
    FROM 
     TFamilies AS TF 
    INNER JOIN 
     TFamilyMembers AS TFM 
    INNER JOIN 
     VActiveMembers AS vAM ON (TFM.intMemberID = vAM.intMemberID) 
     ON (TFM.intParishFamilyID = TF.intParishFamilyID) 
    WHERE 
     TF.intStatusFlagID = 1 
    GROUP BY 
     TF.intParishFamilyID 

Je voulais juste un compte en utilisant le calcul de l'âge juste pour voir si je pouvais obtenir un décompte correct des membres dans une famille, alors je pourrais commencer à tirer parti de cela pour obtenir le compte des membres d'un certain âge. Le résultat que je reçois est de 2 mais il y a 3 membres garantis pour chaque famille.

Le résultat Je cherche est ce

Family_ID |  K12Count 
----------------------------- 
1001   |  2 
1002   |  0 
1003   |  1 
1004   |  0 

Voici une liste des ressources que je levais les yeux en essayant de comprendre cela, peut-être l'un d'entre eux est en fait la réponse et je ne vois pas mais je suis perdu pour le moment.

SQL Select Count from below a certain age

How to get count of people based on age groups using SQL query in Oracle database?

Count number of user in a certain age's range base on date of birth

Conditional Count on a field

http://timmurphy.org/2010/10/10/conditional-count-in-sql/

Merci d'avance!

* EDIT *

CREATE VIEW VActiveFamilyMembersK12Count 
AS 
SELECT 
TF.intParishFamilyID, 
SUM(CASE WHEN intMemberAge >= 5 AND intMemberAge <= 18 THEN 1 ELSE 0 END) AS intK12Count 
FROM 
TFamilies AS TF 
    INNER JOIN TFamilyMembers AS TFM 
     INNER JOIN VActiveMembers AS vAM 
     ON (TFM.intMemberID = vAM.intMemberID) 
    ON (TFM.intParishFamilyID = TF.intParishFamilyID) 

WHERE 
TF. intStatusFlagID = 1 

GROUP BY 
TF.intParishFamilyID 

GO 

CECI EST LA SOLUTION CI-DESSUS.

+0

utilisez-vous SQL Server? –

+0

OUI désolé devinez que j'aurais dû mettre cela dans la question – user3119737

Répondre

0

Le nombre conditionnel est le chemin à parcourir. Quelque chose comme:

SELECT intParishFamilyID, 
COUNT(CASE WHEN intMemberAge >=5 and intMemberAge <=18 THEN 1 ELSE 0 END) 
FROM 
    TFamilies AS TF 
     INNER JOIN TFamilyMembers AS TFM 
      INNER JOIN VActiveMembers AS vAM 
      ON (TFM.intMemberID = vAM.intMemberID) 
     ON (TFM.intParishFamilyID = TF.intParishFamilyID) 

WHERE 
    TF. intStatusFlagID = 1 

GROUP BY 
    TF.intParishFamilyID 
+0

Grande différence entre OR et AND. Cela fait le travail que je tapais OU et qui signifie ET. – user3119737