Question

Je veux compter les villes par sexe, comme celui-ci;

City    GenderFCount  GenderMCount
Redmond 10             20   

Voici ma question devient ville et le sexe dans la base de données 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

S'il est possible que vous pourriez montrer la solution à bien des égards, comme "PIVOT", par fonction sql (UDF), procédure stockée ou d'autres façons.

Merci

Était-ce utile?

La solution

Voici la requête PIVOT, vous pouvez jeter que dans une procédure stockée ou 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

Exemple de l'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

maintenant, vous pouvez l'appeler comme ça

 SELECT * FROM dbo.fnPivot()

Autres conseils

Ici, il utilise un CTE, intégré dans une procédure. Maintenant, j'utilise AdventureWorks 2012, parce que c'est tout ce que j'ai. Mais le concept est le même.

    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

Si vous voulez créer, plutôt que de modifier, une procédure, il suffit de changer « ALTER » pour « créer ». Puis rafraîchir la liste des procédures stockées et vous pouvez le modifier à partir de là. Après cela, le « Create » affiche automatiquement « ALTER » et les modifications seront enregistrées lorsque vous appuyez sur F5, si elle est couronnée de succès. Ensuite, vous pouvez taper EXEC dbo.GenderCountbyCity (ou quel que soit votre nom est) [ou tout simplement un clic droit de la procédure et sélectionnez Exécuter une procédure stockée] et vous obtiendrez les résultats.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top