2017-01-04 2 views
1

Прежде всего извините, вопрос не описывает мою проблему, и я не знаю, как сказать это как вопрос.SQL Outer Join views

Я хочу рассчитать, сколько женщин и мужчин с руководителем должности работает в каждой отрасли.

Так что это 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
B0 09,0,1
B010,0,1
B011,1,0
B012,0,1
B013,1,0
B014,1,0
=> Отсутствует B002, 0,0

Но я не получаю ветвь с идентификатором «B002», у нее есть ANzahlFSuperv = 0 и ANzahlMSuperv = 0. Поэтому у него нет супервизора. Итак, как получить этот результат?

Решение должно быть в представлениях, поэтому, как получить этот BranchID.

Я пробовал все, но ничего не стоял.

Надеюсь, вы, ребята, можете помочь мне!

Спасибо!

+0

Переместите 'WHERE' положение в' ON' пункта. Это эффективно делает ваш 'OUTER JOIN'' INNER JOIN', так как он выполняет * после того, как будут возвращены результаты «OUTER JOIN». – Siyual

+0

Спасибо, что это должно быть внутреннее соединение, иногда вы пытаетесь все, хотя знаете, что не делает, так как я попробую это благодаря! – IsoFunCode

+0

Я пробовал: SELECT Branch.BranchID, COUNT (*) As AnzahlM, Staff.position FROM Staff internal JOIN Branch ON Branch.BranchID = Staff.BranchFK И пол LIKE 'F' И позиция LIKE 'Supervisor' GROUP BY Branch.BranchID, Staff.position но не работает! Тот же результат! – IsoFunCode

ответ

1

Зачем использовать для этого виды? Просто left join и group 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; 
+0

Дело в том, что условие 'position' находится в соединении, а не в предложении' where'. – JohnHC

+0

Спасибо, я попробую это тоже! – IsoFunCode

+0

Так что спасибо за это, но что делает: SUM (CASE WHEN s.gender = 'F' THEN 1 ELSE 0 END), как женщины? Я искал везде, чтобы избежать создания, но я не знаю, что это такое! – IsoFunCode