如何在 2 个查询的结果之间执行减法运算
一组?
你很接近你所拥有的。但是,有一些更改可以使这项工作更容易:
-
Alias你们两个的结果
subqueries。这将使它们更易于使用。
- 从您的子查询中返回更多列,以便您可以加入“某事”,这将允许减法仅发生在匹配的行上。
- 为您的
Count(*) 语句添加别名。同样,这将使它们更易于使用。
如果此图片展示了您正在寻找的内容:
那么我相信这个查询会对你有所帮助:
SELECT op.ApartmentType,
op.ApartmentLocation,
op.TotalOwned,
ISNULL(tp.TotalOccupied, 0) AS [TotalOccupied],
op.TotalOwned - ISNULL(tp.TotalOccupied,0) AS [TotalVacant]
FROM
(
SELECT *,
COUNT(*) as TotalOwned
FROM SO_SubtractionQuestion.OwnedProperties
GROUP BY ApartmentType, ApartmentLocation
) AS op
LEFT JOIN
(
SELECT *,
COUNT(*) as TotalOccupied
FROM [SO_SubtractionQuestion].[OccupiedProperties]
GROUP BY ApartmentType, ApartmentLocation
) AS tp
ON op.ApartmentType = tp.ApartmentType
AND op.ApartmentLocation = tp.ApartmentLocation
我将此查询设置为与您自己的类似:它有一个带有两个子查询的 select 语句,并且子查询在分组查询上具有 Count(*)。我还添加了我上面建议的内容:
- 我的第一个子查询别名为
op(拥有的属性),我的第二个子查询别名为 tp(占用的属性)。
- 我将返回更多列,以便在外部查询中正确加入它们。
- 我的子查询中的
Count(*) 语句有别名。
在我的外部查询中,我可以加入 ApartmentType 和 ApartmentLocation(查看下面的示例表/数据设置)。这将创建一个在 ApartmentType 和 ApartmentLocation 上连接的结果集,该结果集还包含有多少 Owned Properties(来自第一个子查询的 Count(*))和有多少 Occupied Properties(来自第二个子查询的 Count(*))。在这一点上,因为我把所有的东西都做了别名,所以我可以做简单的减法来看看有多少属性是空置的op.TotalOwned - ISNULL(tp.TotalOccupied,0) AS [TotalVacant]。
我还使用ISNULL 来纠正空值。如果我没有这个,那么对于第二个子查询中没有匹配的行,减法的结果也将为 null。
测试表/数据设置
要自己设置示例,请运行以下查询:
步骤 1
出于组织目的
CREATE SCHEMA SO_SubtractionQuestion;
第二步
CREATE TABLE SO_SubtractionQuestion.OwnedProperties
(
ApartmentType varchar(20),
ApartmentLocation varchar(20)
);
CREATE TABLE SO_SubtractionQuestion.OccupiedProperties
(
ApartmentType varchar(20),
ApartmentLocation varchar(20)
);
INSERT INTO [SO_SubtractionQuestion].[OwnedProperties] VALUES ('Studio', 'New York'), ('Studio', 'New York'), ('Studio', 'New York'), ('House', 'New York'), ('House', 'Madison');
INSERT INTO [SO_SubtractionQuestion].[OccupiedProperties] VALUES ('Studio', 'New York'), ('Studio', 'New York');