سؤال

أريد أن أحسب المدن حسب الجنس ، مثل هذا ؛

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 (أو أيا كان اسمك) [أو فقط انقر بزر الماوس الأيمن على الإجراء واختر تنفيذ الإجراء المخزن] وستحصل على النتائج.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top