从 VIEW 对计算列执行 COUNT()

Performing COUNT() on a computed Column from a VIEW

所以我想做的就是有一个视图,显示每个家庭中有多少 5 - 18 岁(含)的孩子。我正在使用 SQL 服务器。

我写的获取家庭成员年龄的视图是

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 只是一个标志,表示该成员处于活动状态。

现在我已经尝试了大约 3 个小时来解决这个问题,但我无法解决。在这里,我没有尝试一举获得解决方案,而是尝试逐步解决,但后来我仍然没有得到我想要的结果。

如您所见,我没有使用计算 AGE 的视图,因为 "Multi-part Identifier could not be bound" 我已经看到该错误,但在这种情况下我无法让它消失。理想情况下,我希望在 VIEW 上执行计数,而不是重新重新计算年龄

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

我只想使用年龄计算来计算,看看是否可以正确计算一个家庭的成员数,然后我可以开始在此基础上计算特定年龄的成员数。我得到的结果是 2 但保证每个家庭有 3 名成员。

我要找的结果是这个

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

这是我为了解决这个问题而查找的资源列表,也许其中之一就是答案,但我只是看不到,但我现在不知所措。

SQL Select Count from below a certain age

Conditional Count on a field

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

在此先致谢!

* 编辑 *

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

这就是上面的解决方案。

条件计数是可行的方法。 类似于:

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