加入同一个表两次时分组

Posted

技术标签:

【中文标题】加入同一个表两次时分组【英文标题】:Group by when joining the same table twice 【发布时间】:2008-10-22 20:39:14 【问题描述】:

我正在编写一个查询来汇总一些数据。我在表中有一个基本上是布尔值的标志,所以我需要一些基于它的一个值的总和和计数,然后对另一个值进行相同的处理,如下所示:

select
   location
  ,count(*)
  ,sum(duration)
from my.table
where type = 'X'
  and location = @location
  and date(some_tstamp) = @date
group by location

然后对于 type 列的另一个值也是如此。如果我加入这个表两次,我如何仍然分组所以我只能得到每个表的聚合,即 count(a.*) 而不是 count(*)...

编写两个单独的查询会更好吗?

编辑

谢谢大家,但我不是这个意思。我需要分别获取 type = 'X' 的摘要和 type = 'Y' 的摘要...让我发布一个更好的示例。我的意思是这样的查询:

select
   a.location
  ,count(a.*)
  ,sum(a.duration)
  ,count(b.*)
  ,sum(b.duration)
from my.table a, my.table b
where a.type = 'X'
  and a.location = @location
  and date(a.some_tstamp) = @date
  and b.location = @location
  and date(b.some_tstamp) = @date
  and b.type = 'Y'
group by a.location

我需要按什么分组?另外,DB2 不喜欢 count(a.*),这是一个语法错误。

【问题讨论】:

以下两个答案都能满足您的需求,具体取决于您是水平还是垂直。 您能否向我们展示一个小型数据集以及您所期望的示例? 【参考方案1】: select location ,Sum(case when type = 'X' then 1 else 0 end) as xCount ,Sum(case when type = 'Y' then 1 else 0 end) as YCount ,Sum(case when type = 'X' then duration else 0 end) as xCountDuration ,Sum(case when type = 'Y' then duration else 0 end) as YCountDuration from my.table where location = @location and date(some_tstamp) = @date group by location

这应该可以在 SQL Server 中使用。我猜db2应该有类似的东西。

编辑:添加 where 条件以限制记录选择 type = X 或 type = Y,如果“type”可以具有 X 和 Y 以外的值。

【讨论】:

【参考方案2】:

您的连接示例没有多大意义。您正在 A 和 B 之间做笛卡尔积。这真的是您想要的吗?

下面将为满足 WHERE 子句的每一对找到 count(*) 和 sum(duration)。根据您的描述,这听起来像是您正在寻找的内容:

select
   type
  ,location
  ,count(*)
  ,sum(duration)
from my.table
where type IN ('X', 'Y')
  and location = @location
  and date(some_tstamp) = @date
group by type, location

【讨论】:

打败了我。这就是你要找的。​​span> 如果您希望表中的每种类型都使用它,请省略“类型 IN ('X', 'Y') 和”【参考方案3】:

要使计数起作用,而不是 count(a.*),只需执行 count(a.location) 或任何其他非空列(PK 将是理想的)。

至于主要问题,以上 shahkalpesh 或 George Eadon 给出的答案都可以。此示例中没有理由将表连接两次。

【讨论】:

以上是关于加入同一个表两次时分组的主要内容,如果未能解决你的问题,请参考以下文章

有条件加入同一张表两次

mysql加入2个表 - 但必须加入同一个表两次

Laravel Eloquent Eager Loading:加入同一张表两次

加入表两次 - 在同一个表的两个不同列上

在 2 个数据帧 Spark 中缓存同一张表两次

加入同一个表时 SQL 结果计数发生变化