データベースに4つのテーブルがあります。倉庫にはクライアントが所有する箱があり、ボックスにはファイルがあります。 Client
テーブル、Warehouse
テーブル、Boxes
テーブル、およびFiles
テーブルがあります。JOINを使用した3つのテーブルのSQLカウント
のでClient
テーブルを外部キーとしてWarehouseID
があり、Boxes
テーブルには外部キーとしてClientID
を持ち、Files
テーブルは外部キーとしてBoxID
を持っています。私は、各クライアントがクエリで持っているボックスとファイルの数と、倉庫の内外にあるボックスの数を数えたいと思います。 Boxes
およびFiles
テーブルのStatus
フィールドは、ボックスとファイルが倉庫の中または外にあるかどうかを決定します。私は、ボックスに次のクエリを実行し、数字が正しい:回数の出力が正しい
ClientID | ClientName | WarehouseName | BoxCount | BoxesIn | BoxesOut | BoxesForDestruction
1 | ACME Corp. | FooFactory | 22744 | 22699 | 45 | 7888
:
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]
これはの出力を生成します。 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
を実行すると、余分な行がカウントを膨らませます。ウェアハウスの行は1つだけなので、その結合はカウントに影響しません。倉庫に出入りするファイルとボックスの正しい数を取得するためにクエリを変更するにはどうすればよいですか?
これは完璧に、ありがとうございました。 – Nse