【问题标题】:Subtraction between 2 SQL queries with group by使用 group by 的 2 个 SQL 查询之间的减法
【发布时间】:2016-12-25 03:06:47
【问题描述】:

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

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

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
 1       studio     newYork
 6       studio     pekin
 3       apprtment  pekin
 5       house      london
 1       house      lagos

【问题讨论】:

  • 您能展示一下您的表格的结构吗?
  • 我确实简化了我的问题,实际上每个选择都是几个表的连接
  • 我看到你尝试了this answer 作为起点。您的问题本质上与那个问题不同,因为另一个问题想要一个结果,而您想要许多结果,每个结果都显示两个相似集合之间的差异。

标签: sql-server tsql


【解决方案1】:

只使用条件聚合:

SELECT COUNT(*) -
       SUM(CASE WHEN <some_condition> THEN 1 ELSE 0 END) AS some_count,
       column2,
       column3
FROM yourTable
GROUP BY column2, column3

这里的&lt;some_condition&gt; 是原始秒计数查询的WHERE 子句中出现的任何内容。

【讨论】:

  • 我也喜欢这个回复,因为这帮助我更深入地研究了条件聚合,并通过简单地设置条件并将数字乘以零或 -1(取决于哪个数字)来创建一个显示赤字的总和应该从中减去)。示例:SUM(CASE WHEN FailureType = 'Existing Failure' THEN [value] WHEN FailureType = 'New Failure' THEN -1*[value] END) AS [SummedValues]
【解决方案2】:

如何在 2 个查询的结果之间执行减法运算 一组?

你很接近你所拥有的。但是,有一些更改可以使这项工作更容易:

  1. Alias你们两个的结果 subqueries。这将使它们更易于使用。
  2. 从您的子查询中返回更多列,以便您可以加入“某事”,这将允许减法仅发生在匹配的行上。
  3. 为您的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');

【讨论】:

  • @bob 没问题!如果解决了您的问题,请务必accept an answer! (或评论/要求澄清,如果没有)。
  • 很好,彻底的回应!
【解决方案3】:
Select Column2, Column3, Count(*)-(Select Count(*)
                                   From Table2 
                                   Where Table1.Column2=Table2.Column2 and Table1.Column3=Table2.Column3)
From Table1
Group by Column2, Column3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2011-07-07
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多