Sql server sql查询中的多次计数

Sql server sql查询中的多次计数,sql-server,tsql,Sql Server,Tsql,我需要一份来自数据库的报告,在那里我需要最终结果,比如 男性的数量,女性的数量,表现出对抗城市,最后对抗国家。 我一开始是这样的 SELECT p.StateName, d.CityName, count(api.Gender) as Gender FROM dbo.Application_Personal_information as api INNER JOIN dbo.state as p ON api.State = p.ID INNER J

我需要一份来自数据库的报告,在那里我需要最终结果,比如 男性的数量,女性的数量,表现出对抗城市,最后对抗国家。 我一开始是这样的

SELECT     p.StateName,  d.CityName,
 count(api.Gender) as Gender
FROM       dbo.Application_Personal_information as api INNER JOIN
           dbo.state as p ON api.State = p.ID INNER JOIN
           dbo.City as d ON api.City= d.ID
           group by p.StateName, d.CityName
当我这么做的时候

   SELECT     p.StateName,  d.CityName,
     count(api.Gender = 'Male) as Male,
     count(api.Gender = 'Female) as Female,
    FROM       dbo.Application_Personal_information as api INNER JOIN
               dbo.state as p ON api.State = p.ID INNER JOIN
               dbo.City as d ON api.City= d.ID
               group by p.StateName, d.CityName
这给了我错误。 不正确的语法near=。 我还尝试了select语句

 COUNT(select api.Gender from api where api.Gender ='Male') as Male,
但它也不起作用。 ...
有什么想法吗?

如果您使用的是SQL Server 2005或更高版本,您可以尝试PIVOT功能:

WITH CTE AS
(   SELECT  p.StateName,  
            d.CityName,
            api.Gender
    FROM    dbo.Application_Personal_information as api 
            INNER JOIN dbo.state as p 
                ON api.State = p.ID 
            INNER JOIN dbo.City as d 
                ON api.City= d.ID
)
SELECT  *
FROM    CTE
        PIVOT
        (   COUNT(Gender)
            FOR Gender IN ([Male], [Female])
        ) pvt

请参阅下面的答案:如果您需要输出与您所显示的完全一致,那么它会稍微复杂一些。这同样有效——但我怀疑它会慢得多——但速度在这里可能不是问题。
SUM(Gender='Male')
在MySQL中也有效(因为
TRUE
1
FALSE
0
)那太好了。但它对MySQL更为通用,有时可能会让您感到困惑:)是的,您的查询更不依赖数据库。(我真的以为这是用MySQL标记的,是吗?)。我更喜欢
COUNT()
而不是
SUM()
,但我不认为有任何性能差异:
COUNT(当Gender='Male'时为1,则为1,否则为空)
但当使用COUNT over SUM时,您不会收到关于空值的警告吗?PIVOT是在2005版中引入的:)@Madhivana Oops。。。编辑了我的答案。谢谢
WITH CTE AS
(   SELECT  p.StateName,  
            d.CityName,
            api.Gender
    FROM    dbo.Application_Personal_information as api 
            INNER JOIN dbo.state as p 
                ON api.State = p.ID 
            INNER JOIN dbo.City as d 
                ON api.City= d.ID
)
SELECT  *
FROM    CTE
        PIVOT
        (   COUNT(Gender)
            FOR Gender IN ([Male], [Female])
        ) pvt