SQL - 加入两个表并计算不同的东西

时间:2018-03-04 13:40:43

标签: sql

我有两张桌子TEILNEHMERKURS和KURS。

航向对接:

| Bezeichnung      | 
| ---------------- |
| Java Programming | 
| Java Programming | 
| Database         |

和第二个表TEILNEHMERKURS

| Bezeichnung      | 
| ---------------- |
| Database         | 
| Java Programming | 
| Database         |

我需要一个Statment来生成以下输出:

| Bezeichnung      | Count in Table Kurs |Count in Table Teilnehmerkurs
| ---------------- |-------------------- |-----------------------------
| Database         | 1                   |2
| Java Programming | 2                   |1

我尝试了以下声明:

select k.bezeichnung, count(k.bezeichnung), count(tk.bezeichnung)
from kurs k
    left join teilnehmerkurs tk on tk.kursnr = k.kursnr
group by k.bezeichnung;

我的实际输出是:

| Bezeichnung      | Count in Table Kurs |Count in Table Teilnehmerkurs
| ---------------- |-------------------- |-----------------------------
| Database         | 2                   |2
| Java Programming | 2                   |1

3 个答案:

答案 0 :(得分:1)

您可以在FULL JOIN之后单独使用group by

DECLARE @Kurs TABLE ( Bezeichnung VARCHAR(50))

INSERT INTO @Kurs VALUES 
('Java Programming'),
('Java Programming'),
('Database')

DECLARE @TEILNEHMERKURS TABLE( Bezeichnung VARCHAR(50))
INSERT INTO @TEILNEHMERKURS VALUES
('Database'),
('Java Programming'),
('Database')


SELECT COALESCE(K.Bezeichnung, T.Bezeichnung) Bezeichnung
    , K.[Count in Table Kurs]
    , T.[Count in Table Teilnehmerkurs] 
FROM 
    (SELECT Bezeichnung, COUNT(*) [Count in Table Kurs] FROM @Kurs GROUP BY Bezeichnung ) K
    FULL JOIN 
    (SELECT Bezeichnung, COUNT(*) [Count in Table Teilnehmerkurs] FROM @TEILNEHMERKURS GROUP BY Bezeichnung) T
    ON K.Bezeichnung = T.Bezeichnung

结果:

Bezeichnung          Count in Table Kurs Count in Table Teilnehmerkurs
-------------------- ------------------- -----------------------------
Database             1                   2
Java Programming     2                   1

答案 1 :(得分:0)

这可能很棘手。一个非常简单的方法是union allgroup by

select Bezeichnung, sum(inkurs), sum(inTeilnehmerkurs)
from ((select Bezeichnung, count(*) as inkurs, 0 as inTeilnehmerkurs
       from kurs
       group by Bezeichnung
      ) union all
      (select Bezeichnung, 0 as inkurs, count(*) as inTeilnehmerkurs
       from Teilnehmerkurs
       group by Bezeichnung
      )
     ) kt
group by Bezeichnung;

如果您使用join将结果合并在一起,那么您必须小心在两个表中都缺少Bezeichnung。如果您使用full outer join,则需要使用coalesce()

答案 2 :(得分:0)

您可以使用select union从表格中获取所有Bezeichnung然后左边加入计数

  select t.Bezeichnung, tk.count_in_kurs, tt.count_in_teilnehmerkurs
  from (
  select Bezeichnung
  from Kurs
  union 
  select Bezeichnung
  from TEILNEHMERKURS) 
  left join (
  select Bezeichnung, count(*) as count_in_kurs
  from kurs 
  group by Bezeichnung
  ) tk on t.Bezeichnung = tk.Bezeichnung
  left join (
  select Bezeichnung, count(*) as count_in_TEILNEHMERKURS
  from kurs 
  group by Bezeichnung
  ) tt on t.Bezeichnung = tt.Bezeichnung