6

私は次の構造を持っています:

typ1 と typ2 の複数のイベントがある日。typ1 と typ2 は、それぞれの日への外部キーを持ちます。Typ2 にも期間があります。

ここで、すべての typ1 イベント、すべての typ2 イベント、および typ2 期間の合計をカウントしたいと考えています。

サンプルデータ:

日:

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

私は今結果が欲しい:

Day.ID = 1 | countTyp1 = 2 | countTyp2 = 2 | sumDurationTyp2 = 30

私の問題は合計です。「個別の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;
4

2 に答える 2

14

これに対する私の一般的なアプローチは、結合する前に各テーブルを事前に集計することです。

部分的には、実際には個別の値を合計していないためです (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
于 2012-10-16T13:03:41.250 に答える
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;
于 2012-10-16T12:55:01.293 に答える