选择动态列出现次数

时间:2014-12-02 03:23:49

标签: sql-server group-by dynamic-columns

使用如下表格:

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

(按名称列出动态列,按国家和州分组)

是否可以用一句话来构建它?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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;
相关问题