加入同一个表两次时分组
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 给出的答案都可以。此示例中没有理由将表连接两次。
【讨论】:
以上是关于加入同一个表两次时分组的主要内容,如果未能解决你的问题,请参考以下文章