2008-10-22 48 views
1

我正在寫一個查詢來總結了一些數據。我在那基本上是布爾表中的一個標誌,所以我需要一些資金,並根據它的一個價值數,然後爲其他值同樣的事情,就像這樣:集團通過加入同一個表時兩次

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

,然後在同一爲類型列的另一個值。如果我加入這個表兩次,我如何仍然組,所以我只能得到每個表的聚合,即計數(一個*),而不是計數(*)...

是否會更好地寫兩個單獨的疑問?

編輯

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

+0

兩個答案給你你想要的東西,這取決於如果你想讓它水平或垂直的。 – TheSoftwareJedi 2008-10-22 21:06:36

+0

你能告訴我們一個小數據集和你所期望的例子嗎? – 2008-10-23 13:13:05

回答

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條件來限制記錄選擇類型= X或類型= Y,如果「類型」可以有比X和Y

5

您與加入不使一個很大的意義的例子。你正在做A和B之間的笛卡兒積。這真的是你想要的嗎?

下面將找到COUNT(*)和總和(持續時間)對每個滿足WHERE子句對。根據您的描述,這聽起來像你在找什麼:

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 
1

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

至於主要問題,無論是shahkalpesh或喬治Eadon給出的答案上面會工作。在這個例子中沒有理由將表加入兩次。下面