【问题标题】:Select with dynamic columns occurrences使用动态列出现选择
【发布时间】:2014-12-02 03:23:48
【问题描述】:

使用如下表格:

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

(使用动态列按名称计数出现次数,按国家和州分组)

有没有可能只用一句话来搭建?

【问题讨论】:

  • 基于您问题中的动态词可能是 @wewestthemenace 的答案是更好的答案

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


【解决方案1】:

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

样本数据

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)

【讨论】:

    【解决方案2】:

    需要pivot操作才能达到效果。

    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;
    

    【讨论】:

    • 正是我需要的。非常感谢!
    • @gtryonp 很高兴为您提供帮助。
    • @mr_eclair 动态在哪里
    • @Rajesh 我猜提问者使用动态问题而不是枢轴。
    • 见下面@wewestthemenace 的回答,他使用的是动态的,但它比你的复杂一点
    猜你喜欢
    • 2011-09-03
    • 2018-04-25
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 2021-10-20
    • 2021-06-08
    • 1970-01-01
    相关资源
    最近更新 更多