Patrick Trunkl
Patrick Trunkl

Reputation: 13

How can I merge two tables in a query?

I have two tables in my database, one for leaving planes and one for arriving planes. Each of them includes a column which contains the runway sign. Now I want to make a query where I combine the two tables and count how many planes have arrived at the runway and how many have left.

This is my attempt:

SELECT runway_sign as Landebahn, [Anzahl gelandet], [Anzahl gestartet]  from
    (
        SELECT runway_sign, COUNT(runway_sign) as [Anzahl gelandet], 0 as [Anzahl gestartet] FROM tbl_arriving_planes
            GROUP BY runway_sign
    ) as b
    UNION
    SELECT runway_sign as Landebahn, [Anzahl gelandet] ,[Anzahl gestartet]  from
    (
        SELECT runway_sign, 0 as [Anzahl gelandet], COUNT(runway_sign) as [Anzahl gestartet] FROM tbl_leaving_planes
            GROUP BY runway_sign
    ) as a

Result should look like this:

runway_sign | number of arrived planes | number of leaving planes

Upvotes: 0

Views: 65

Answers (2)

Caleth
Caleth

Reputation: 62576

It sounds like you want to group on the result of the UNION

SELECT runway_sign as Landebahn, SUM([Anzahl gelandet]) as [Anzahl gelandet], SUM([Anzahl gestartet]) as [Anzahl gestartet]
FROM (
    SELECT runway_sign, 1 as [Anzahl gelandet], 0 as [Anzahl gestartet] FROM tbl_arriving_planes
    UNION
    SELECT runway_sign, 0 as [Anzahl gelandet], 1 as [Anzahl gestartet] FROM tbl_leaving_planes
) as a
GROUP BY runway_sign

Upvotes: 1

Gordon Linoff
Gordon Linoff

Reputation: 1269483

You can use UNION ALL followed by another aggregation:

SELECT runway_sign as Landebahn,
       SUM([Anzahl gelandet]),
       SUM([Anzahl gestartet])
FROM ((SELECT runway_sign, COUNT(runway_sign) as [Anzahl gelandet], 0 as [Anzahl gestartet]
       FROM tbl_arriving_planes
       GROUP BY runway_sign
      ) UNION ALL
      (SELECT runway_sign as Landebahn, 0 as [Anzahl gelandet], COUNT(runway_sign) as [Anzahl gestartet]
       FROM tbl_leaving_planes
       GROUP BY runway_sign
      )
     ) al
GROUP BY runway_sign;

An alternative method uses FULL JOIN rather than UNION ALL:

SELECT COALESCE(a.runway_sign, l.runway_sign) as Landebahn,
       a.[Anzahl gelandet],
       l.[Anzahl gestartet]
FROM (SELECT runway_sign, COUNT(runway_sign) as [Anzahl gelandet]
      FROM tbl_arriving_planes
      GROUP BY runway_sign
     ) a FULL JOIN
     (SELECT runway_sign as Landebahn, COUNT(runway_sign) as [Anzahl gestartet]
      FROM tbl_leaving_planes
      GROUP BY runway_sign
     ) l
     ON l.runway_sign = a.runway_sign

Upvotes: 3

Related Questions