簡體   English   中英

兩次加入同一張桌子時按分組

[英]Group by when joining the same table twice

我正在寫一個查詢以匯總一些數據。 我的表中的標志基本上是布爾值,因此我需要根據一個值對它們進行加和計數,然后對另一個值進行相同的計算,例如:

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(*)...

編寫兩個單獨的查詢會更好嗎?

編輯

謝謝大家,但這不是我的意思。 我需要分別獲得類型='X'的摘要和類型='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。 * ),這是一個語法錯誤。


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應該有類似的東西。

編輯:如果“類型”可以具有X和Y以外的值,則添加一個where條件以限​​制記錄選擇type = X或type =Y。

您的聯接示例沒有多大意義。 您正在做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

為了使計數工作,而不是count(a。*)而是count(a.location)或任何其他非空列(PK是理想的)。

關於主要問題,上述的shahkalpesh或George Eadon給出的答案中的任何一個都行得通。 在此示例中,沒有理由將表兩次連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM