2014-12-02 42 views
1

与表所示:动态栏选择出现

name country state 
----- ------- ----- 
ana  usa  ca 
paul usa  wy 
louis can  ot 
ana  usa  ca 
john can  al 
paul usa  wy 
john usa  ca 
ana  usa  ca 
louis can  ot 

我需要一个像结果:

country state ana paul louis john 
-------- ----- ---- ---- ----- ---- 
usa  ca  3  1  0  1 
      wy  0  1  0  0 
can  ot  0  0  2  0 
      al  0  0  0  1 

(计数出现的名字与动态列,按国家和状态)

只用一句话就可以构建它吗?

+0

基于您的问题的动态词可能是** @ wewesthemenace **的答案是一个更好的答案 – Rajesh 2014-12-02 04:10:47

回答

1

您需要透视操作来实现结果。

http://sqlfiddle.com/#!3/aae09/3

select country, state, 
     sum(case when name='ana' then 1 else 0 end) as ana, 
     sum(case when name='paul' then 1 else 0 end) as paul, 
     sum(case when name='john' then 1 else 0 end) as john, 
     sum(case when name='louis' then 1 else 0 end) as louis 
from table_name 
group by country, state 
order by country,state desc; 
+1

正是我需要的。非常感谢! – gtryonp 2014-12-02 03:48:39

+0

@gtryonp很高兴为您效劳。 – 2014-12-02 03:50:36

+1

@mr_eclair动态 – Rajesh 2014-12-02 03:52:59

2

如果你想有一个动态的方式:

样本数据

create table MyTable(
    name varchar(20), 
    country varchar(20), 
    state varchar(20) 
) 
insert into MyTable values 
('ana', 'usa', 'ca'), 
('paul', 'usa', 'wy'), 
('louis', 'can', 'ot'), 
('ana', 'usa', 'ca'), 
('john', 'can', 'al'), 
('paul', 'usa', 'wy'), 
('john', 'usa', 'ca'), 
('ana', 'usa', 'ca'), 
('louis', 'can', 'ot'); 

解决方案使用CROSSTAB

declare @sql1 as varchar(4000) = '' 
declare @sql2 as varchar(4000) = '' 
declare @sql3 as varchar(4000) = '' 

select @sql1 = 
'select 
    country 
    ,state 
' 

select @sql2 = @sql2 + 
' ,sum(case when name = ''' + name + ''' then 1 else 0 end) as [' + name + ']' + char(10) 
from (
    select distinct name from MyTable 
)t 
order by name 

select @sql3 = 
'from MyTable 
group by country, state 
order by country, state desc 
' 

print (@sql1 + @sql2 + @sql3) 
exec (@sql1 + @sql2 + @sql3)