如何为一列中的每个不同可能性计数生成一行表,包括null?

时间:2014-03-07 00:05:49

标签: sql sql-server

在另一次编辑之后,这里是一个新标题和一个新范围,保留旧标题。

获取此样本数据......

    ('1', 'male'),
    ('2', 'female'),
    ('3', 'other'),
    ('4', 'male'),
    ('5', 'female'),
    ('6', 'male'),
    ('7', null);

把它变成这个......

gender   cnt
female   2
male     3
null     1
other    1

这是预编辑......

我使用PIVOT生成一个表,其中包含基于不同行值的动态生成的列名。

以下是一些示例数据......

CREATE TABLE #tmp ([id] varchar(5), [gender] varchar(10));

INSERT INTO #tmp
    ([id], [gender])
VALUES
    ('1', 'male'),
    ('2', 'female'),
    ('3', 'other'),
    ('4', 'male'),
    ('5', 'female'),
    ('6', 'male'),
    ('7', null);

以下是生成结果表的代码(使用Convert row value in to column in SQL server (PIVOT)How do I count multiple columns in SQL Server?中的一些代码)

---Using Dynamic Pivot
DECLARE @cols AS NVARCHAR(MAX), @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(gender) 
    from #tmp FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'')

set @query = 'SELECT count(*) as cnt,' + @cols + ' 
         from 
         (
            Select id, gender
            from #tmp
         ) dta
         pivot 
         (
            MAX(gender)
            for gender in (' + @cols + ')
         ) pvt 
         group by ' + @cols

 execute(@query);

产生以下内容......

cnt female  male    other
1   NULL    NULL    NULL
1   NULL    NULL    other
3   NULL    male    NULL
2   female  NULL    NULL

由此,我想(动态 - 不能明确指定列名'null','other','female','male'等)产生以下内容......

gender   cnt
null     1
other    2
male     3
female   2

除了产生最终结果之外,对我来说棘手的部分是获得'null'行,因为没有相应的结果列名为'null'。我从再次使用UNPIVOTPIVOT的角度尝试了这一点。所以问题是,如何根据我的数据和计数结果生成这个最终结果表?是否有一种更简单,更有效的方法可以完成所有工作?

1 个答案:

答案 0 :(得分:1)

我不确定我究竟究竟是什么问题...为什么不使用Count和group?不需要真正转动/解开(我认为)

select gender, count(*) as cnt from #tmp group by gender

希望它有所帮助吗?