从 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
所以我想做的就是有一个视图,显示每个家庭中有多少 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