2010-08-22 32 views
7

Quiero contar las ciudades por género, así;SQL AdventureWorks cuenta empleados por sexo por ciudad

City GenderFCount GenderMCount 
Redmond 10    20 

Aquí es mi consulta obtiene ciudad y de género en la base de datos 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 

Si es posible se puede mostrar la solución de muchas maneras, como "eje", por la función de SQL (UDF) , Procedimiento almacenado u otras formas.

gracias

+0

lo siento, quiero contar el sexo por ciudades – qods

+0

Una sugerencia: si usa alias que son abreviaturas de sus tablas, podría ser más fácil de leer, por ejemplo, hre para HumanResources.Employee. Estoy seguro de que hay muchas personas que lo hacen de diferentes maneras. Pero para mí, ayuda a mantener el nivel de confusión bajo. Además, el uso de esos alias en la declaración de selección, incluso cuando técnicamente no son necesarios, puede recordarle de qué tabla lo sacó. – DaveX

Respuesta

6

Ésta es la consulta de pivote, se puede volcar de que en un procedimiento almacenado o 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 

Ejemplo de la 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 

ahora se le puede llamar como esto

SELECT * FROM dbo.fnPivot() 
0

Aquí está usando un CTE, incrustado en un procedimiento. Ahora, estoy usando AdventureWorks 2012, porque eso es todo lo que tengo. Pero el concepto es el mismo

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 desea crear, en lugar de alterar, un procedimiento, basta con cambiar "ALTER" para "crear". A continuación, actualice su lista de procedimientos almacenados y puede modificarla desde allí. Después de eso, el "CREAR" mostrará automáticamente "ALTERAR" y cualquier cambio se guardará cuando presione F5, si es exitoso. Luego puede escribir EXEC dbo.GenderCountbyCity (o cualquiera que sea su nombre) [o simplemente haga clic con el botón derecho en el procedimiento y elija Ejecutar procedimiento almacenado] y obtendrá los resultados.