具有多个表计数的SQL视图

具有多个表计数的SQL视图,sql,c,sql-server,count,subquery,Sql,C,Sql Server,Count,Subquery,我有一个带有SQL Server的nodejs应用程序。我希望能够有一个视图,在那里我可以得到多个组织的用户,项目,任务数量的统计。假设我有4个表,如下所示: 表格: * **OrganizationStats**: numberOfProjects, numberOfUsers, numberOfTasks orgId(FK) 2, 3, 2, 1 3, 1, 1, 2 0, 0 ,0, 3 组织机构:组织ID(主键),组织名称 项目:项目(PK)、组织(FK)、项目名称 任务:任务ID

我有一个带有SQL Server的nodejs应用程序。我希望能够有一个视图,在那里我可以得到多个组织的用户,项目,任务数量的统计。假设我有4个表,如下所示: 表格:

* **OrganizationStats**: numberOfProjects, numberOfUsers, numberOfTasks orgId(FK)

2, 3, 2, 1
3, 1, 1, 2
0, 0 ,0, 3
  • 组织机构:组织ID(主键),组织名称
  • 项目:项目(PK)、组织(FK)、项目名称
  • 任务:任务ID(PK)、项目(FK)、任务名称
  • 用户:用户ID(PK)、组织ID(FK)、用户名
查看:

* **OrganizationStats**: numberOfProjects, numberOfUsers, numberOfTasks orgId(FK)

2, 3, 2, 1
3, 1, 1, 2
0, 0 ,0, 3
  • OrganizationStats:NumberOfProject、numberOfUsers、numberOfTasks orgId(FK)
有人建议使用这样的方法:

CREATE VIEW dbo.vw_OrganisationStats AS

    SELECT {Columns from OrganizationStats},
           P.Projects AS NumProjects
    FROM dbo.OrganizationStats OS
         CROSS APPLY (SELECT COUNT(*) AS Projects
                      FROM dbo.Projects P
                      WHERE P.OrgID = OS.OrgID) P;
我的问题是,除了同一视图中的项目之外,我在添加任务和用户的计数时遇到问题。任何帮助都将不胜感激

**Sample Data:** 
* **Organization**: orgId(PK), orgName
1, ACME Inc.
2, Walmart Inc.
3, YoYo Inc.

* **Project**: projId(PK), orgId(FK), projName
1, 1, ACME Project 1
2, 1, ACME Project 2
3, 2, Walmart Project 1
4, 2, Walmart Project 2
5, 2, Walmart Project 3

* **Tasks**: taskId(PK), projId(FK), taskName
1, 1, Task 1 for Acme Project 1
2, 1, Task 2 for Acme Project 1
3, 4, Task 1 for Walmart Project 2

* **Users**: userId(PK), orgId(FK), userName
1, 1, Bob
2, 1, Alex
3, 1, Jim
4, 2, John
预期结果 查看:

* **OrganizationStats**: numberOfProjects, numberOfUsers, numberOfTasks orgId(FK)

2, 3, 2, 1
3, 1, 1, 2
0, 0 ,0, 3
考虑:

select o.orgid, 
    count(distinct p.projid) as cnt_projects, 
    count(distinct u.userid) as cnt_users,
    count(*) cnt_tasks
from organization o
inner join projects p on p.orgid = o.orgid
inner join users    u on u.orgid = o.orgid
inner join tasks    t on t.projid = p.projid and t.userid = u.userid
group by o.orgid
考虑:

select o.orgid, 
    count(distinct p.projid) as cnt_projects, 
    count(distinct u.userid) as cnt_users,
    count(*) cnt_tasks
from organization o
inner join projects p on p.orgid = o.orgid
inner join users    u on u.orgid = o.orgid
inner join tasks    t on t.projid = p.projid and t.userid = u.userid
group by o.orgid
使用的脚本:

CREATE TABLE Organization (orgId INT , orgName VARCHAR(20))
CREATE TABLE Project(projId INT, orgId INT, projName VARCHAR(20))
CREATE TABLE Tasks (taskId INT, projId INT, taskName VARCHAR(20))
CREATE TABLE Users (userId INT, orgId INT, userName  VARCHAR(20))

INSERT INTO Organization VALUES (1, 'ORG 1'), (2, 'ORG 2')
INSERT INTO Organization VALUES (3, 'ORG 3')
INSERT INTO Project VALUES (1,1, 'PRO 11'), (2,2, 'PRO 21'), (3,2, 'PRO 22')
INSERT INTO Tasks VALUES (1, 1, 'TASK 11'), (2, 1, 'TASK 21'), (3, 2, 'TASK 32'), (4, 2, 'TASK 42'), (5, 2, 'TASK 52')
INSERT INTO Users VALUES (1, 1, 'USER 11'), (2, 1, 'USER 12'), (3, 2, 'USER 21')
结果:

+-------+---------------+------------------+---------------+
| orgId | numberOfUsers | numberOfProjects | numberOfTasks |
+-------+---------------+------------------+---------------+
| 1     | 2             | 1                | 2             |
+-------+---------------+------------------+---------------+
| 2     | 1             | 2                | 3             |
+-------+---------------+------------------+---------------+
| 3     | 0             | 0                | 0             |
+-------+---------------+------------------+---------------+
使用的脚本:

CREATE TABLE Organization (orgId INT , orgName VARCHAR(20))
CREATE TABLE Project(projId INT, orgId INT, projName VARCHAR(20))
CREATE TABLE Tasks (taskId INT, projId INT, taskName VARCHAR(20))
CREATE TABLE Users (userId INT, orgId INT, userName  VARCHAR(20))

INSERT INTO Organization VALUES (1, 'ORG 1'), (2, 'ORG 2')
INSERT INTO Organization VALUES (3, 'ORG 3')
INSERT INTO Project VALUES (1,1, 'PRO 11'), (2,2, 'PRO 21'), (3,2, 'PRO 22')
INSERT INTO Tasks VALUES (1, 1, 'TASK 11'), (2, 1, 'TASK 21'), (3, 2, 'TASK 32'), (4, 2, 'TASK 42'), (5, 2, 'TASK 52')
INSERT INTO Users VALUES (1, 1, 'USER 11'), (2, 1, 'USER 12'), (3, 2, 'USER 21')
结果:

+-------+---------------+------------------+---------------+
| orgId | numberOfUsers | numberOfProjects | numberOfTasks |
+-------+---------------+------------------+---------------+
| 1     | 2             | 1                | 2             |
+-------+---------------+------------------+---------------+
| 2     | 1             | 2                | 3             |
+-------+---------------+------------------+---------------+
| 3     | 0             | 0                | 0             |
+-------+---------------+------------------+---------------+

你能把样本数据和预期结果放进去吗。。更新了原始问题我的回答中添加了解释选择和脚本都已根据您的评论(测试)进行了更新,请再次检查您是否可以输入样本数据和预期结果请:确定。。更新了原始问题我的回答中添加了解释选择和脚本都根据您的评论(测试)进行了更新,请再次检查,我所做的编辑是错误的。我正在编辑我的帖子,似乎答案的顺序突然改变了,我在你的帖子上点击了编辑。再次抱歉,我没有能力重新备份。抱歉,我所做的编辑是错误的。我正在编辑我的帖子,似乎答案的顺序突然改变了,我在你的帖子上点击了编辑。再次抱歉,我无法重新备份。请尝试添加没有项目的组织。你的解决方案不能解决这个问题scenario@SeanD,选择已更新,再次检查,添加没有项目的组织。你的解决方案不能解决这个问题scenario@SeanD,选择已更新,请再次检查