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

问题描述 投票:0回答:3

我有两张桌子参加课程和课程。

课程:

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

和第二表参加者课程

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

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

| 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
sql
3个回答
1
投票

你可以在FULL JOINseparately之后使用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

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()


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
© www.soinside.com 2019 - 2024. All rights reserved.