提供以下简单的表结构:
Departments PK - DeptID DeptName -------------------------- 1 Department 1 2 Department 2 3 Department 3 4 Department 4 Groups PK - GroupdID DeptID -------------------------- 1 1 2 1 3 3 4 4 5 2 6 3 7 1 8 3 Inventory PK - ItemID GroupID -------------------------- 1 2 2 3 3 8 4 1 5 4 6 5 7 1 8 2 9 2 10 3 11 7
有没有一种方法可以不使用子查询(这很容易)我可以获得部门列表,每个部门的组数以及每个部门的库存数量?
示例输出:
DeptID DeptName GroupCount ItemCount
-----------------------------------------------------
1 Department 1 3 6
2 Department 2 1 1
3 Department 1 3 3
4 Department 4 1 1
我的直觉告诉我,让GROUP BY语句正确是一个简单的问题,但到目前为止,我正在画一个空白。如果它确实需要使用子查询,这不是问题。我只想确认以供参考。
注意:针对此特定问题使用SQL Server 2000
答案 0 :(得分:11)
SELECT d.deptID,
COUNT(DISTINCT g.GroupID) AS Groups,
COUNT(DISTINCT i.ItemID) AS Items
FROM Departments d
LEFT JOIN
Groups g
ON g.deptID = d.deptID
LEFT JOIN
Items i
ON i.GroupID = g.GroupID
GROUP BY
d.deptID
产生的结果是:
deptID Groups Items
----- ------ -----
1 3 6
2 1 1
3 3 3
4 1 1
对于没有0
或Departments
没有Groups
的{{1}},这也会产生正确的Groups
。
答案 1 :(得分:1)
以下是获得结果的至少一种方法。
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
答案 2 :(得分: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
答案 3 :(得分:0)
抱歉,我不是坐在我的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