首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按第一列分组,然后拆分(枢轴?)其余两列

按第一列分组,然后拆分(枢轴?)其余两列
EN

Stack Overflow用户
提问于 2013-06-27 21:57:29
回答 3查看 822关注 0票数 7

TSQL问题在这里。请参阅下面图像中的源和期望输出。还提供了生成源表的代码。

代码语言:javascript
复制
DECLARE @tablevar TABLE(
record nvarchar(10),
category nvarchar(50),
value float)

INSERT INTO @tablevar
VALUES
('110-AL','credits_cle',1),
('110-AL','credits_ethics',2),
('110-AR','credits_ethics',2.5),
('110-AZ','credits_prof_resp',1.5),
('110-AZ', 'credits_ethics',5),
('110-AZ', 'credits_cle',4)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-27 23:04:59

由于您希望枢轴化两列数据,所以您可以这样做的一种方法是同时应用UNPIVOT和PIVOT函数。UNPIVOT将将多列categoryvalue转换为多个行,然后可以应用支点获得最终结果:

代码语言:javascript
复制
select record, 
  category1, value1, 
  category2, value2, 
  category3, value3
from
(
  select record, col+cast(seq as varchar(10)) col, val
  from
  (
    select record, category, 
      cast(value as nvarchar(50)) value,
      row_number() over(partition by record order by category) seq
    from tablevar
  ) d
  unpivot
  (
    val
    for col in (category, value)
  ) unpiv
) src
pivot
(
  max(val)
  for col in (category1, value1, category2, value2, category3, value3)
) piv;

与Demo

如果有未知数量的值,则必须使用类似于以下内容的动态SQL:

代码语言:javascript
复制
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(col+cast(seq as varchar(10))) 
                    from
                    (
                      select row_number() over(partition by record order by category) seq
                      from tablevar
                    ) d
                    cross apply
                    (
                      select 'category', 1 union all
                      select 'value', 2
                    ) c (col, so)
                    group by seq, so, col
                    order by seq, so
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query = 'SELECT record,' + @cols + ' 
             from 
             (
               select record, col+cast(seq as varchar(10)) col, val
                from
                (
                  select record, category, 
                    cast(value as nvarchar(50)) value,
                    row_number() over(partition by record order by category) seq
                  from tablevar
                ) d
                unpivot
                (
                  val
                  for col in (category, value)
                ) unpiv
            ) x
            pivot 
            (
                max(val)
                for col in (' + @cols + ')
            ) p '

execute(@query);

请参阅与Demo

票数 5
EN

Stack Overflow用户

发布于 2013-06-27 22:37:26

这是我第一次使用支点,代码可能很难看。下面是:

代码语言:javascript
复制
with ranked as (
    select *, RANK() OVER (PARTITION by record ORDER by category) as r
    from @tablevar
), labeled as (
    select record, category as content, 'category' + CAST(r as varchar(MAX)) as label
     from ranked
    union all
    select record, cast(value AS nvarchar(MAX)),  'value' + CAST(r as varchar(MAX)) as label
     from ranked) --select * from labeled
select record, [category1] as [category], [value1] as [value], [category2] as [category], [value2] as [value], [category3] as [category], [value3] as [value]
from (SELECT * FROM labeled) as source
PIVOT(
    max(content)
    for label in ([category1], [value1], [category2], [value2], [category3], [value3])) as pvt
票数 2
EN

Stack Overflow用户

发布于 2013-06-27 22:44:11

这是我的刺刀

代码语言:javascript
复制
;with Z as
(
select record, category, value,  ROW_NUMBER() over (partition by record order by category) as ranker
from @tablevar
) 
select Z2.record, Z2.c1, Z3.v1, Z2.c2, Z3.v2, Z2.c3, Z3.v3 from 
(
select  record, [1] c1, [2] c2, [3] c3 from 
(select record, category, ranker from Z) as Z0
pivot
( min(category) for ranker in ([1], [2], [3])) as pvt
) Z2

join
(
select  record, [1] v1, [2] v2, [3] v3 from 
(select record, value, ranker from Z) as Z1
pivot
( min(value) for ranker in ([1], [2], [3])) as pvt
) Z3 
on Z2.record = Z3.record
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17353920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档