Здесь используется CTE, встроенный в процедуру. Теперь я использую AdventureWorks 2012, потому что это все, что у меня есть. Но концепция та же самая.
USE [AdventureWorks]
GO
/****** Object: StoredProcedure [dbo].[GenderCountbyCity] Script Date: 4/20/2016 9:07:04 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[GenderCountbyCity]
AS
BEGIN
;WITH EmpF
AS (
SELECT pa.City, hre.Gender, COUNT(hre.Gender) AS CountF
FROM Person.BusinessEntityAddress pbea
JOIN Person.Address pa
ON pbea.AddressID = pa.AddressID
JOIN HumanResources.Employee hre
ON pbea.BusinessEntityID = hre.BusinessEntityID
WHERE hre.Gender = 'F'
GROUP BY pa.City, hre.Gender
),
EmpM
AS (
SELECT pa.City, hre.Gender, COUNT(hre.Gender) AS CountM
FROM Person.BusinessEntityAddress pbea
JOIN Person.Address pa
ON pbea.AddressID = pa.AddressID
JOIN HumanResources.Employee hre
ON pbea.BusinessEntityID = hre.BusinessEntityID
WHERE hre.Gender = 'M'
GROUP BY pa.City, hre.Gender
)
SELECT COALESCE(EmpF.City,EmpM.City) AS City, COALESCE(EmpF.CountF,0) AS GenderFCount, COALESCE(EmpM.CountM,0) AS GenderMCount
FROM EmpF
FULL JOIN EmpM
ON EmpF.City = EmpM.City
ORDER BY COALESCE(EmpF.City,EmpM.City)
END
Если вы хотите создать, а не изменять процедуру, просто измените «ALTER» на «CREATE». Затем обновите ваш список хранимых процедур, и вы можете изменить его оттуда. После этого «CREATE» автоматически покажет «ALTER», и любые изменения будут сохранены, когда вы нажмете F5, если это будет успешно. Затем вы можете ввести EXEC dbo.GenderCountbyCity (или как вас там зовут) [или просто щелкнуть правой кнопкой мыши по процедуре и выбрать «Выполнить хранимую процедуру»], и вы получите результаты.