2010-08-22 12 views
7

Je veux compter les villes par genre, comme ceci;SQL AdventureWorks compte les employés par sexe par ville

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 moyens.

grâce

+0

désolé je veux compter le genre par les villes – qods

+0

Une suggestion: si vous utilisez des alias qui sont des abréviations de vos tables, il peut le rendre plus facile à lire, par exemple, hre pour HumanResources.Employee. Je suis sûr qu'il y a beaucoup de gens qui le font de différentes façons. Mais pour moi, cela aide à réduire le niveau de confusion. En outre, l'utilisation de ces alias dans l'instruction select (même s'ils ne sont pas techniquement nécessaires) peut vous rappeler de quelle table vous l'avez tirée. – DaveX

Répondre

6

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 

vous pouvez l'appeler comme ça

SELECT * FROM dbo.fnPivot() 
0

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 actualisez votre liste de procédures stockées et vous pouvez le modifier à partir de là. Après cela, le "CREATE" montrera automatiquement "ALTER" et toutes les modifications seront enregistrées lorsque vous appuyez sur F5, si elle est réussie. Ensuite, vous pouvez taper EXEC dbo.GenderCountbyCity (ou quel que soit votre nom) [ou simplement cliquer avec le bouton droit sur la procédure et choisir Exécuter la procédure stockée] et vous obtiendrez les résultats.