SQL AdventureWorks تحسب الموظفين حسب الجنس من قبل المدينة
-
30-09-2019 - |
سؤال
أريد أن أحسب المدن حسب الجنس ، مثل هذا ؛
City GenderFCount GenderMCount
Redmond 10 20
إليكم استفساري يحصل على المدينة والجنس في قاعدة بيانات AdventureWorks
select Gender,City from HumanResources.Employee as t1
inner join HumanResources.EmployeeAddress as t2
on t1.EmployeeID = t2.EmployeeID
inner join Person.Address as t3
on t2.AddressID = t3.AddressID
إذا كان ذلك ممكنًا ، فهل يمكنك إظهار الحل بعدة طرق ، مثل "Pivot" ، بواسطة وظيفة SQL (UDF) ، الإجراء المخزن أو طرق أخرى.
شكرًا
المحلول
إليكم استعلام Pivot ، يمكنك تفريغ ذلك في إجراء مخزن أو UDF
select City, F as GenderFCount, M as GenderMCount
from(
select Gender,City
from HumanResources.Employee as t1
inner join HumanResources.EmployeeAddress as t2
on t1.EmployeeID = t2.EmployeeID
inner join Person.Address as t3
on t2.AddressID = t3.AddressID
) AS pivTemp
PIVOT
( count(Gender)
FOR Gender IN ([F],[M])
) AS pivTable
مثال على UDF
CREATE FUNCTION fnPivot()
RETURNS TABLE
AS
RETURN (
select City, F as GenderFCount, M as GenderMCount
from(
select Gender,City
from HumanResources.Employee as t1
inner join HumanResources.EmployeeAddress as t2
on t1.EmployeeID = t2.EmployeeID
inner join Person.Address as t3
on t2.AddressID = t3.AddressID
) AS pivTemp
PIVOT
( count(Gender)
FOR Gender IN ([F],[M])
) AS pivTable
)
GO
الآن يمكنك أن تسميها هكذا
SELECT * FROM dbo.fnPivot()
نصائح أخرى
هنا يستخدم 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" وسيتم حفظ أي تغييرات عند الضغط على F5 ، إذا نجحت. ثم يمكنك كتابة exec dbo.gendercountbycity (أو أيا كان اسمك) [أو فقط انقر بزر الماوس الأيمن على الإجراء واختر تنفيذ الإجراء المخزن] وستحصل على النتائج.