【发布时间】:2017-08-11 15:03:15
【问题描述】:
我在一个数据库中有 4 个表。仓库包含客户拥有的盒子,盒子里有文件。有Client 表、Warehouse 表、Boxes 表和Files 表。
所以Client 表有WarehouseID 作为外键,Boxes 表有ClientID 作为外键,Files 表有BoxID 作为外键。我想计算每个客户在我的查询中拥有的盒子和文件的数量,以及进出仓库的盒子数量。 Boxes 和Files 表上的Status 字段确定箱子和文件是进出仓库。我在盒子上运行以下查询并且数字是正确的:
SELECT
[c].[ClientID],
[c].[Name] AS [ClientName],
[w].[Name] AS [WarehouseName],
COUNT(DISTINCT [b].[BoxID]) AS [BoxCount],
SUM(CASE WHEN [b].[Status] = @IN THEN 1 ELSE 0 END)) AS [BoxesIn],
SUM(CASE WHEN [b].[Status] = @OUT THEN 1 ELSE 0 END) AS [BoxesOut],
SUM(CASE WHEN [b].[DestructionDate] <= GETDATE() THEN 1 ELSE 0 END) AS [BoxesForDestruction],
FROM [Clients] AS [c] INNER JOIN [Boxes] AS [b]
ON [c].[ClientID] = [b].[ClientID]
INNER JOIN [Warehouses] AS [w]
ON [c].WarehouseID = [w].[WarehouseID]
WHERE [c].[ClientID] = @ClientID
GROUP BY
[c].[ClientID],
[c].[Name],
[w].[Name]
这会产生以下输出:
ClientID | ClientName | WarehouseName | BoxCount | BoxesIn | BoxesOut | BoxesForDestruction
1 | ACME Corp. | FooFactory | 22744 | 22699 | 45 | 7888
计数的输出是正确的。当我将Files 表添加到INNER JOIN 时,数字就会膨胀。这是 SQL:
SELECT
[c].[ClientID],
[c].[Name] AS [ClientName],
[w].[Name] AS [WarehouseName],
COUNT(DISTINCT [b].[BoxID]) AS [BoxCount],
COUNT(DISTINCT [f].[FileID]) AS [FileCount], -- *NEW*
SUM(CASE WHEN [b].[Status] = @IN THEN 1 ELSE 0 END)) AS [BoxesIn],
SUM(CASE WHEN [b].[Status] = @OUT THEN 1 ELSE 0 END) AS [BoxesOut],
SUM(CASE WHEN [b].[DestructionDate] <= GETDATE() THEN 1 ELSE 0 END) AS [BoxesForDestruction],
FROM [Clients] AS [c] INNER JOIN [Boxes] AS [b]
ON [c].[ClientID] = [b].[ClientID]
INNER JOIN [Warehouses] AS [w]
ON [c].[WarehouseID] = [w].[WarehouseID]
INNER JOIN [Files] AS [f] -- *NEW*
ON [b].[BoxID] = [f].[BoxID] -- *NEW*
WHERE [c].[ClientID] = @ClientID
GROUP BY
[c].[ClientID],
[c].[Name],
[w].[Name]
这给了我下面的计数输出(我省略了前 3 列,因为它们不相关):
BoxCount | FilesCount | BoxesIn | BoxesOut | BoxesForDestruction
19151 | 411961 | 411381 | 580 | 144615
FilesCount 是正确的,但其他数字是关闭的。我知道为什么会这样,但我不知道如何解决它。由于在框和文件上的连接返回了多行,因此创建了额外的行。执行SUM 时,额外的行会增加计数。由于仓库只有一行,因此该连接不会影响计数。如何修改我的查询以获取正确数量的进出仓库的文件和盒子?
【问题讨论】:
标签: sql-server database join sum