2015-11-06 1 views
1

Новое в SQL, используя MS SQL Sever Management Studio с AdventureWorks образца DB:Как объединить два оператора select в одну таблицу с двумя отдельными столбцами?

http://elsasoft.com/samples/sqlserver_adventureworks/sqlserver.spring.katmai.adventureworks/default.htm

Попытка объединить два SELECT заявления каждый из которых содержит COUNT мужского и женского пола сотрудников. Я могу получить оба счета, чтобы возвращать две строки в одной таблице, используя UNION ALL.

SELECT COUNT(HumanResources.Employee.Gender) AS 'Male Employees' 
FROM HumanResources.Employee 
WHERE Employee.Gender = 'M' 
UNION ALL 
SELECT COUNT(HumanResources.Employee.Gender) AS 'Female Employees' 
FROM HumanResources.Employee 
WHERE Employee.Gender = 'F'; 

Однако я пытаюсь получить COUNT каждого M/F в двух отдельных столбцах. Удалось создать два отдельных столбца, но их нет.

SELECT Set1.[Male Employees], Set2.[Female Employees] 
FROM 
( 
    SELECT COUNT(Employee.Gender) AS 'Male Employees' 
    FROM HumanResources.Employee 
    WHERE Employee.Gender = 'M' 
    ) as Set1 
INNER JOIN 
(
    SELECT COUNT(Employee.Gender) AS 'Female Employees' 
    FROM HumanResources.Employee 
    WHERE Employee.Gender = 'F' 
) as Set2 
on Set1.[Male Employees] = Set2.[Female Employees] 

Я чувствую, что я что-то очевидное отсутствует ..

ответ

2

Вы можете сделать это с помощью условной агрегации:

SELECT SUM(CASE WHEN Employee.Gender = 'M' THEN 1 ELSE 0 END) AS 'Male Employees', 
     SUM(CASE WHEN Employee.Gender = 'F' THEN 1 ELSE 0 END) AS 'Female Employees' 
FROM HumanResources.Employee 

Но вы можете сделать это зверское, прямой путь также:

SELECT (SELECT COUNT(HumanResources.Employee.Gender) 
     FROM HumanResources.Employee 
     WHERE Employee.Gender = 'M') AS 'Male Employees', 
     (SELECT COUNT(HumanResources.Employee.Gender) 
     FROM HumanResources.Employee 
     WHERE Employee.Gender = 'F') AS 'Female Employees' 

Первый подход, конечно, предпочтительный путь.

+0

Я вижу, кажется намного более эффективным, чем использование 'INNER JOIN' – girthquake