Sql server 使用group by在两个SQL查询之间进行减法运算
如何使用group by在两个查询的结果之间执行减法 第一个查询返回可以出租的所有房屋的数量,而第二个查询返回已经出租的房屋Sql server 使用group by在两个SQL查询之间进行减法运算,sql-server,tsql,Sql Server,Tsql,如何使用group by在两个查询的结果之间执行减法 第一个查询返回可以出租的所有房屋的数量,而第二个查询返回已经出租的房屋 SELECT (SELECT COUNT(*) FROM ... GroupBy ...) - (SELECT COUNT(*) FROM ... WHERE ...group by) AS Difference 第一个查询结果 count() column2 column3 3 studio newYork 6
SELECT
(SELECT COUNT(*) FROM ... GroupBy ...)
- (SELECT COUNT(*) FROM ... WHERE ...group by) AS Difference
第一个查询结果
count() column2 column3
3 studio newYork
6 studio pekin
3 apprtment pekin
5 house london
1 house lagos
count() column2 column3
2 studio newYork
第二个查询结果
count() column2 column3
3 studio newYork
6 studio pekin
3 apprtment pekin
5 house london
1 house lagos
count() column2 column3
2 studio newYork
我希望根据第二个查询的结果更新第一个查询
count() column2 column3
1 studio newYork
6 studio pekin
3 apprtment pekin
5 house london
1 house lagos
只需使用条件聚合:
SELECT COUNT(*) -
SUM(CASE WHEN <some_condition> THEN 1 ELSE 0 END) AS some_count,
column2,
column3
FROM yourTable
GROUP BY column2, column3
选择计数(*)-
求和(1或0结束时的情况)作为某个计数,
第2栏,
第3栏
从你的桌子上
按第2列、第3列分组
这里是原始第二次计数查询的WHERE
子句中出现的内容
如何在两个查询的结果之间执行减法
一群人
你和你所拥有的很接近。但是,有一些变化可以使这项工作更容易:
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(*)
Count(*)
)和有多少占用的属性(第二个子查询中的Count(*)
)。在这一点上,因为我对所有内容都使用了别名,所以我可以通过简单的减法来查看有多少属性是空的,op.TotalOwned-ISNULL(tp.totalaccumposed,0)作为[totalSpank]
我还使用来更正空值。如果没有,那么对于与第二个子查询不匹配的行,减法的结果也将为null
测试表/数据设置
要为自己设置示例,请执行以下查询:
第一步
为组织目的
CREATE SCHEMA SO_SubtractionQuestion;
步骤2
你能展示一下你的表的结构吗?我确实简化了我的问题,事实上,每个选择都是几个表的连接。我认为你试着作为一个起点。您的问题本质上与该问题不同,因为另一个问题只需要一个结果,而您需要许多结果,每个结果都显示两个相似集合之间的差异。@bob没问题!请确保它是否解决了您的问题!(或评论/要求澄清,如果没有)。伟大的,彻底的回应!我也喜欢这个回答,因为这有助于我更深入地研究条件聚合,并通过简单地设置条件并将数字乘以零或-1(取决于应该从哪个数字中减去哪个数字)来创建一个显示赤字的总和。示例:
SUM(当FailureType='Existing Failure'时为案例,当FailureType='New Failure'时为[value],然后为-1*[value]END)作为[SummedValues]