1

いくつかのデータを要約するクエリを書いています。私は基本的にブール値であるフラグをテーブルに持っているので、その1つの値に基づいていくつかの合計とカウントが必要であり、他の値についても同じことが必要です。

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

そして、type列の別の値についても同じです。このテーブルを2回結合した場合でも、グループ化して、各テーブルの集計のみを取得できるようにするにはどうすればよいですか。つまり*、count(*)ではなくcount(a。)です。

2つの別々のクエリを書く方が良いでしょうか?

編集

みんなありがとう、でもそれは私が言ったことではありません。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 にも似たようなものが必要だと思います。

編集:「タイプ」がXとY以外の値を持つことができる場合、タイプ= Xまたはタイプ= Yを選択するようにレコードを制限する場所条件を追加します。

于 2008-10-22T20:50:54.240 に答える
5

結合の例はあまり意味がありません。あなたは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) を実行するか、その他の null 以外の列を実行します (PK が理想的です)。

主な質問に関しては、上記のshahkalpeshまたはGeorge Eadonの回答のいずれかが機能します。この例では、テーブルを 2 回結合する理由はありません。

于 2008-10-22T22:24:58.590 に答える