またいで参加します。例えば。イベント・テーブルの内容に関係なく、10人のユーザーと15のイベント・タイプがある場合は、150行が戻されます。トン-SQLの外では、私は3つのテーブルを持っている3つのテーブル
2つのテーブル間で作業する外部結合を取得できます(たとえば、すべてのイベントタイプの期間)。ただし、2回目の外部結合は使用できません。
ありがとうございます!
またいで参加します。例えば。イベント・テーブルの内容に関係なく、10人のユーザーと15のイベント・タイプがある場合は、150行が戻されます。トン-SQLの外では、私は3つのテーブルを持っている3つのテーブル
2つのテーブル間で作業する外部結合を取得できます(たとえば、すべてのイベントタイプの期間)。ただし、2回目の外部結合は使用できません。
ありがとうございます!
存在しない関係を得るには、CROSS APPLYを追加する必要があります。
SELECT q.name, q.description, SUM(q.Duration)
FROM (
SELECT p.Name, et.description, Duration = 0
FROM person p
CROSS APPLY eventtype et
UNION ALL
SELECT p.Name, et.description, e.duration
FROM person p
INNER JOIN event e ON e.person_id = p.id
INNER JOIN eventtype et ON et.id = e.eventtypeid
) q
GROUP BY
q.Name, q.description
あなたは人とEVENTTYPEに参加渡り、その後、ちょうどイベント表に結果を結合することができます。
SELECT
p.Name,
et.Description,
COALESCE(e.duration,0)
FROM
person p
cross join
eventtype et
left join
event e
on
p.id = e.person_id and
et.id = e.eventtype_id
クロスが参加するには、左側のテーブルの行ごとに、それは参加しています一つです右のテーブルのすべての行に
person
とeventtype
の組み合わせごとに行を追加する場合は、CROSS JOIN
を追加します。継続時間を取得するには、event
に参加する必要がありますが、常に行があるとは限りませんので、これはOUTER
になる必要があります。 「合計」を使用すると、person
とevent
の組み合わせに対して複数のevent
が存在する可能性があることが示唆されているので、そこにはSUM
も必要です。
サンプルデータ:
insert person values (1, 'Joe')
insert person values (2, 'Bob')
insert person values (3, 'Tim')
insert eventtype values (1, 'Cake')
insert eventtype values (2, 'Pie')
insert eventtype values (3, 'Beer')
insert event values (1, 1, 10)
insert event values (1, 2, 10)
insert event values (1, 2, 5)
insert event values (2, 1, 10)
insert event values (2, 2, 7)
insert event values (3, 2, 8)
insert event values (3, 3, 16)
insert event values (1, 1, 10)
クエリ:
SELECT
PET.person_id
, PET.person_name
, PET.eventtype_id
, PET.eventtype_description
, ISNULL(SUM(E.duration), 0) total_duration
FROM
(
SELECT
P.id person_id
, P.name person_name
, ET.id eventtype_id
, ET.description eventtype_description
FROM
person P
CROSS JOIN eventtype ET
) PET
LEFT JOIN event E ON PET.person_id = E.person_id
AND PET.eventtype_id = E.eventtype_id
GROUP BY
PET.person_id
, PET.person_name
, PET.eventtype_id
, PET.eventtype_description
出力:
person_id person_name eventtype_id eventtype_description total_duration
----------- ----------- ------------ --------------------- --------------
1 Joe 1 Cake 20
1 Joe 2 Pie 15
1 Joe 3 Beer 0
2 Bob 1 Cake 10
2 Bob 2 Pie 7
2 Bob 3 Beer 0
3 Tim 1 Cake 0
3 Tim 2 Pie 8
3 Tim 3 Beer 16
Warning: Null value is eliminated by an aggregate or other SET operation.
(9 row(s) affected)
ありがとうございます - これも機能し、プロセスを私にはっきりとさせてくれました。外部結合は私の望むものではありませんでした。 – meepmeep
これは完全に働いた、ありがとうございました! – meepmeep
ようこそ。 –