【问题标题】:SQL Outer Join viewsSQL 外连接视图
【发布时间】:2017-01-04 14:57:10
【问题描述】:

首先抱歉,这个问题没有描述我的问题,我不知道如何将其作为问题来表达。

我想统计每个分支机构有多少女性和男性担任主管职位。

这就是 SQL:

    CREATE VIEW Women (BranchID,AnzahlF,position ) AS
SELECT       Branch.BranchID, COUNT(*) As AnzahlF,Staff.position
FROM         Staff full outer JOIN
                      Branch ON Branch.BranchID = Staff.BranchFK
WHERE gender LIKE 'F' AND position LIKE 'Supervisor'
GROUP BY Branch.BranchID,Staff.position

CREATE VIEW Men (BranchID,AnzahlM,position ) AS
SELECT       Branch.BranchID,COUNT(*) As AnzahlM ,Staff.position
FROM         Staff Full outer JOIN
                      Branch ON Branch.BranchID = Staff.BranchFK
WHERE gender LIKE 'M' AND position LIKE 'Supervisor'
GROUP BY Branch.BranchID,Staff.position


    Select ISNULL(Women.BranchID, Men.BranchID) AS BranchID,
    Case When (Women.AnzahlF is Null) THEN  0 
ELSE Women.AnzahlF  END As ANzahlFSuperv,
    Case When (Men.AnzahlM is Null) THEN  0 
ELSE Men.AnzahlM  END As ANzahlMSuperv
    from Women  Full outer join Men  On Women.BranchID = Men.BranchID
    Group by Women.BranchID, Men.BranchID,Women.ANzahlF,Men.AnzahlM Order by BranchID

这是输出: BranchID,ANzahlFSuperv, ANzahlMSuperv
B001,2,0
B003,1,1
B004,1,1
B005,1,0
B006,1,0
B007,0,2
B008,1,1
B009,0,1
B010,0,1
B011,1,0
B012,0,1
B013,1,0
B014,1,0
=> 缺少 B002, 0,0

但我没有得到 ID 为“B002”的分支,它的 ANzahlFSuperv = 0 和 ANzahlMSuperv = 0。所以它没有主管。那么如何得到这个结果呢?

解决方案必须在视图中,因此如何获取此 BranchID。

我什么都试过了,但一文不值。

希望你们能帮帮我!

谢谢!

【问题讨论】:

  • WHERE 子句移至ON 子句。它有效地使您的OUTER JOIN 成为INNER JOIN,因为它在返回OUTER JOIN 结果之后执行
  • 谢谢,这一定是内部连接,有时你会尝试一切,虽然你知道那没有用,因为我会试试这个谢谢!
  • 我试过这个: SELECT Branch.BranchID,COUNT(*) As AnzahlM ,Staff.position FROM Staff inner JOIN Branch ON Branch.BranchID = Staff.BranchFK AND gender LIKE 'F' AND position LIKE '主管的 GROUP BY Branch.BranchID,Staff.position 但不起作用!结果一样!

标签: sql join outer-join


【解决方案1】:

您为什么要为此使用视图?只是一个left joingroup by

SELECT b.BranchID, COUNT(*) As AnzahlM,
       SUM(CASE WHEN s.gender = 'F' THEN 1 ELSE 0 END) as females,
       SUM(CASE WHEN s.gender = 'M' THEN 1 ELSE 0 END) as males
FROM Branch b LEFT JOIN
     Staff s
     ON b.BranchID = s.BranchFK AND s.position = 'Supervisor'
GROUP BY b.BranchID;

【讨论】:

  • 需要注意的是条件position在join中而不是在where子句中。
  • 谢谢,我也试试看!
  • 所以感谢这项工作,但什么是:SUM(CASE WHEN s.gender = 'F' THEN 1 ELSE 0 END) 和女性一样?我到处搜索只是为了避免创建视图,但我找不到!
  • @IsoFunCode 。 . .这是sum() 中的case。因此,它为每位女性员工的总数加 1——有效地计算女性人数。
猜你喜欢
  • 2012-11-21
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-31
  • 2021-09-02
相关资源
最近更新 更多