Sql server 使用group by在两个SQL查询之间进行减法运算

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

如何使用group by在两个查询的结果之间执行减法

第一个查询返回可以出租的所有房屋的数量,而第二个查询返回已经出租的房屋

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(*)
      语句有别名
    在外部查询中,我可以加入ApartmentTypeApartmentLocation(查看下面的示例表/数据设置)。这将创建一个在ApartmentType和ApartmentLocation上联接的结果集,该结果集还包含有多少拥有的属性(第一个子查询中的
    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]