2012-10-16 3 views
5

私は以下の構造を持っています:SQL:値の合計ですが、異なるIDのみです - 条件付き合計?

typ1とtyp2の複数のイベントを持つ日です。ここで、typ1とtyp2はそれぞれの日に外部キーを持っています。 Typ2にも継続時間があります。

ここでは、すべてのタイプ1イベント、すべてのタイプ2イベント、およびタイプ2期間の合計をカウントしたいとします。

例データ:

日:

ID = 1 | Date = yesterday | ... 

TYP1:

ID = 1 | FK_DAY = 1 | ... 

ID = 2 | FK_DAY = 1 | ... 

TYP2:

ID = 1 | FK_DAY = 1 | duration = 10 

ID = 2 | FK_DAY = 1 | duration = 20 

私は今、結果をしたい:

私の問題は「私は別個のtyp2.IDの合計」のようなものが必要です。誰かがそれを解決する方法を知っていますか?参加する前に、

SELECT day.id, 
    count(DISTINCT typ1.id), 
    count(DISTINCT typ2.id), 
    sum(duration) AS duration 
FROM days 
    LEFT JOIN typ 
      ON day.id = typ1.id 
    LEFT JOIN typ2 
      ON day.id = typ2.id 
GROUP BY day.id; 
これへの私の一般的なアプローチは、事前に集計各テーブルに
+0

RDBMSとは何ですか? – Tobsey

答えて

13

です:

私は次のようなものを使っていますが、もちろん、それは私が望むように動作しません。 。

2つの行のそれぞれが10の場合は、実際には別の値を合計していないため、答えはまだ20です。

しかし、ほとんどの場合、それは実際には単純な方法です。サブクエリは集約を行い、結合はすべて1:1です。

SELECT 
    days.id, 
    typ_agg.rows, 
    type2_agg.rows, 
    type2_agg.duration 
FROM 
    days 
LEFT JOIN 
    (SELECT fk_day, COUNT(*) as rows FROM typ GROUP BY fk_day) AS typ_agg 
    ON days.id = typ_agg.fk_day 
LEFT JOIN 
    (SELECT fk_day, COUNT(*) as rows, SUM(duration) as duration FROM typ2 GROUP BY fk_day) AS typ2_agg 
    ON days.id = typ2_agg.fk_day 
+1

。 。これが適切なアプローチであるため、これが受け入れられた答えであることを希望します。 –

+0

本当にありがとう、私の実際のクエリでは、より複雑で、実際にはもっと読みやすくなります – prom85

0
SELECT day.id, 
    count(DISTINCT typ1.id), 
    count(DISTINCT typ2.id), 
    (select sum(t2.duration) 
    from typ2 t2 
    where t2.id = day.id 
    ) AS duration 
FROM days 
    LEFT JOIN typ 
      ON day.id = typ1.id 
    LEFT JOIN typ2 
      ON day.id = typ2.id 
GROUP BY day.id; 
+0

これは追加のサブクエリを導入し、OPが単一のクエリソリューションを探していたと思います。あなたの答えは、それが単一のクエリとして記述できないことを暗示する意味ですか? – Yuck

+0

@Yuck - 'single query'または' no sub-queries'はどこにありますか? 'サブクエリ'が '単一クエリ'の一部ではないと思うのはなぜですか? *(もし彼らが何かの 'サブ'であれば、それらはその一部であり、 'それは単一のクエリです...)*特定のRDBMSがサブクエリを使い果たしても例外ではありません。 – MatBailie

+0

私のdownvoteではないFWIW。そして、少なくともSQL Serverでは、この種のクエリでは(しばしば)重大なパフォーマンス上の不利益があります。それは間違っていません。私はちょうど質問をしていた - 関連するテーブルをサブ選択せずにこれを行う方法はありますか? – Yuck