1

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

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. *),这是一个语法错误。

4

3 回答 3

6

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 以外的值。

于 2008-10-22T20:50:54.240 回答
5

您的 join 示例没有多大意义。您正在 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
于 2008-10-22T20:43:15.503 回答
1

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

至于主要问题,上面 shahkalpesh 或 George Eadon 给出的任何一个答案都行得通。此示例中没有理由将表连接两次。

于 2008-10-22T22:24:58.590 回答