在另一次编辑之后,这里是一个新标题和一个新范围,保留旧标题。
获取此样本数据......
('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'。我从再次使用UNPIVOT
或PIVOT
的角度尝试了这一点。所以问题是,如何根据我的数据和计数结果生成这个最终结果表?是否有一种更简单,更有效的方法可以完成所有工作?
答案 0 :(得分:1)
我不确定我究竟究竟是什么问题...为什么不使用Count和group?不需要真正转动/解开(我认为)
select gender, count(*) as cnt from #tmp group by gender
希望它有所帮助吗?