使用如下表格:
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 :(得分: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');
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;