Tsql SQL查询中的多重计数

Tsql SQL查询中的多重计数,tsql,sql-server-2000,group-by,Tsql,Sql Server 2000,Group By,给出以下简单的表格结构: 有没有一种不使用子查询(这很容易)的方法可以让我获得部门列表、每个部门的组数以及每个部门的库存数 示例输出: DeptID DeptName GroupCount ItemCount ----------------------------------------------------- 1 Department 1 3 6 2 Department 2

给出以下简单的表格结构:

有没有一种不使用子查询(这很容易)的方法可以让我获得部门列表、每个部门的组数以及每个部门的库存数

示例输出:

DeptID    DeptName          GroupCount      ItemCount
-----------------------------------------------------
1         Department 1      3               6
2         Department 2      1               1
3         Department 1      3               3
4         Department 4      1               1    
我的直觉告诉我,这只是一个简单的问题,让小组的陈述正确,但到目前为止,我画了一个空白。如果它确实需要使用子查询,这不是问题。我只是想确认一下,以备将来参考


注意:使用SQL Server 2000解决此特定问题

对不起,我没有坐在我的SQL Server前面。这是你的第一次尝试。我可能无法正确理解您期望的结果,但也许您可以将此作为起点

SELECT 
  Department.DeptId,
  Department.DeptName,
  Group.GroupId,
  COUNT (Inventory.GroupId) as TotalItems
FROM
  Department
  INNER JOIN Groups
    On (Department.DeptId = Groups.DeptId)
  INNER JOIN Inventory
    On (Inventory.GroupId = Groups.GroupId)
GROUP BY
  Department.DeptId,
  Department.DeptName
  Group.GroupId,
  Inventory.GroupId

以下至少是获得结果的一种方法

SELECT d.DeptID, d.DeptName, ISNULL(g.Groups, 0), ISNULL(t.TotalItems, 0)
FROM 
  Departments d
  LEFT OUTER JOIN (
    SELECT d.DeptID, Groups = COUNT(*)
    FROM Departments d
         INNER JOIN Groups g ON g.DeptID = d.DeptID
    GROUP BY d.DeptID
  ) g ON g.DeptID = d.DeptID
  LEFT OUTER JOIN (
    SELECT d.DeptID, TotalItems = COUNT(*)
    FROM Departments d
         INNER JOIN Groups g ON g.DeptID = d.DeptID
         INNER JOIN Inventory i ON i.GroupID = g.GroupID
    GROUP BY d.DeptID
  ) t ON t.DeptID = d.DeptID
结果如下:

deptID  Groups  Items
-----   ------  -----
1       3       6 
2       1       1
3       3       3
4       1       1
这也将为没有
或只有
而没有
项目的
部门
生成正确的
0
,以下是我的尝试

declare @Depatments table
(
DeptID  int
,DeptName  varchar(15)
)

declare @Groups table
(
GroupID  int
,DeptID  int
)

declare @Inventory table
(
ItemID    int
,GroupID  int
)

INSERT INTO @Depatments VALUES (1,'Department 1')
INSERT INTO @Depatments VALUES (2,'Department 2')
INSERT INTO @Depatments VALUES (3,'Department 3')
INSERT INTO @Depatments VALUES (4,'Department 4')

INSERT INTO @Groups VALUES (1,1)
INSERT INTO @Groups VALUES (2,1)
INSERT INTO @Groups VALUES (3,3)
INSERT INTO @Groups VALUES (4,4)
INSERT INTO @Groups VALUES (5,2)
INSERT INTO @Groups VALUES (6,3)
INSERT INTO @Groups VALUES (7,1)
INSERT INTO @Groups VALUES (8,3)

INSERT INTO @Inventory VALUES (1 ,2)
INSERT INTO @Inventory VALUES (2 ,3)
INSERT INTO @Inventory VALUES (3 ,8)
INSERT INTO @Inventory VALUES (4 ,1)
INSERT INTO @Inventory VALUES (5 ,4)
INSERT INTO @Inventory VALUES (6 ,5)
INSERT INTO @Inventory VALUES (7 ,1)
INSERT INTO @Inventory VALUES (8 ,2)
INSERT INTO @Inventory VALUES (9 ,2)
INSERT INTO @Inventory VALUES (10,3)
INSERT INTO @Inventory VALUES (11,7)


--works with derived tables
SELECT
    d.DeptName,dt_g.CountOf AS GroupCount, dt_i.CountOf AS InventotyCount
    FROM @Depatments  d
        LEFT OUTER JOIN (SELECT
                             COUNT(*) AS CountOf,DeptID
                             FROM @Groups
                             GROUP BY DeptID
                        ) dt_g ON d.DeptID=dt_g.DeptID
        LEFT OUTER JOIN (SELECT
                             COUNT(*) AS CountOf,g.DeptID
                             FROM @Groups               g
                                 INNER JOIN @Inventory  i ON g.GroupID=i.GroupID
                             GROUP BY DeptID
                        ) dt_i ON d.DeptID=dt_i.DeptID

@列文:谢谢你的标签编辑。我已经习惯于在2005年工作了,所以标记已经成为我的本能。@TheTXI:别提了。顺便说一句,我相信第二部门的组数和项目数应该是1?!为什么第二部门的组数是0?如果我完全搞砸了,我真的不会感到惊讶。这是使用完全随机的数据,所以我试图把数据加起来。如果有人发现算术中有错误,请随意编辑。我使用派生表方法和@Quassnoi query获得与@TheTXI相同的组总数。部门2有1个组,所以@Quassnoi,你的数据一定是错误的,你的查询给出了正确的值,查看我的答案,抓取我的表,插入并重试…在样本数据上,你的查询可以工作,但它会为没有组的部门选择noting。非常好。下次我将等到SQLExpress安装完成后再回答。笛卡尔连接在这里几乎是不可能的。很可能是组和部门之间的哈希连接,然后是结果集和项目之间的哈希连接。如果GroupID和DeptID是主键,那么结果集的行数将与Departments完全相同。是的,我的想法被搞砸了-我认为项目是加入到Departments,而不是组。Doh.great answer,但是使用COUNT(DISTINCT ISNULL(xxxxx,0))来消除警告:Null值被聚合或其他集合操作消除。对于没有组的部门,使用ISNULL将返回1而不是0对于没有组的部门,使用ISNULL将返回1而不是0。我最初试图用SUM来消除空值(如果为空,则为0,否则为1结束),但结果表明,仅仅计数更简单,警告实际上并不有害:)@Quassnoi,正确!我忘了它周围的COUNT()是如何计算0的!
deptID  Groups  Items
-----   ------  -----
1       3       6 
2       1       1
3       3       3
4       1       1
declare @Depatments table
(
DeptID  int
,DeptName  varchar(15)
)

declare @Groups table
(
GroupID  int
,DeptID  int
)

declare @Inventory table
(
ItemID    int
,GroupID  int
)

INSERT INTO @Depatments VALUES (1,'Department 1')
INSERT INTO @Depatments VALUES (2,'Department 2')
INSERT INTO @Depatments VALUES (3,'Department 3')
INSERT INTO @Depatments VALUES (4,'Department 4')

INSERT INTO @Groups VALUES (1,1)
INSERT INTO @Groups VALUES (2,1)
INSERT INTO @Groups VALUES (3,3)
INSERT INTO @Groups VALUES (4,4)
INSERT INTO @Groups VALUES (5,2)
INSERT INTO @Groups VALUES (6,3)
INSERT INTO @Groups VALUES (7,1)
INSERT INTO @Groups VALUES (8,3)

INSERT INTO @Inventory VALUES (1 ,2)
INSERT INTO @Inventory VALUES (2 ,3)
INSERT INTO @Inventory VALUES (3 ,8)
INSERT INTO @Inventory VALUES (4 ,1)
INSERT INTO @Inventory VALUES (5 ,4)
INSERT INTO @Inventory VALUES (6 ,5)
INSERT INTO @Inventory VALUES (7 ,1)
INSERT INTO @Inventory VALUES (8 ,2)
INSERT INTO @Inventory VALUES (9 ,2)
INSERT INTO @Inventory VALUES (10,3)
INSERT INTO @Inventory VALUES (11,7)


--works with derived tables
SELECT
    d.DeptName,dt_g.CountOf AS GroupCount, dt_i.CountOf AS InventotyCount
    FROM @Depatments  d
        LEFT OUTER JOIN (SELECT
                             COUNT(*) AS CountOf,DeptID
                             FROM @Groups
                             GROUP BY DeptID
                        ) dt_g ON d.DeptID=dt_g.DeptID
        LEFT OUTER JOIN (SELECT
                             COUNT(*) AS CountOf,g.DeptID
                             FROM @Groups               g
                                 INNER JOIN @Inventory  i ON g.GroupID=i.GroupID
                             GROUP BY DeptID
                        ) dt_i ON d.DeptID=dt_i.DeptID