【问题标题】:Data normalization: switch column and rows of data数据规范化:切换数据的列和行
【发布时间】:2017-03-16 16:21:49
【问题描述】:

我有一张这样的桌子:

Table 1
ID   Data
1    Name
2    Adam
3    SEX
4    Male
5    AGE
6    27
7    Name
8    Bob
9    SEX
10   Male
11   AGE
12   28

我想把它转换成以下格式

ID  NAME  SEX   AGE
1   Adam  Male   27
2   Bob   Male   28

如何在 Sql Server 中做到这一点? 谢谢

【问题讨论】:

标签: sql sql-server-2012


【解决方案1】:

给你:

insert into table2
select t1.Data "name", t2.Data "sex", t3.Data "Age"
from table1 t1,
table1 t2,
table1 t3
where (t1.ID + 4) % 6 = 0
and (t2.ID + 2) % 6 = 0
and t3.ID % 6 = 0
and t1.ID + 2 = t2.ID
and t1.ID + 4 = t3.ID

亚当男 27 岁

鲍勃男 28 岁

爱丽丝女 99

我添加了一条额外的记录,以仔细检查它是否可以在您的数据的前两次迭代之后继续工作。顺便说一句,您将无法为此使用 PIVOT,因为您的数据未标准化

【讨论】:

    【解决方案2】:
    create table #tt
    (id int, data varchar(20))
    
    insert #tt
    (id , data)
    values
    (1,'Name'),
    (2,'Adam'),
    (3,'SEX'),
    (4,'Male'),
    (5,'AGE'),
    (6,'27'),
    (7,'Name'),
    (8,'Bob'),
    (9,'SEX'),
    (10,'Male'),
    (11,'AGE'),
    (12,'28')
    
    
    create table #endResult
    (ID int identity(1,1), Name varchar(50),SEX VARCHAR(6), Age int)
    
    insert #endResult
    (Name, SEX, Age )
    select 
            t2.data as Name
            ,t4.data as SEX
            ,t6.data as Age 
    from 
            #tt t1 
    join 
            #tt t2 
        on 
            t1.data = 'Name'
        and 
            t1.id+1 = t2.id
    join 
            #tt t3 
        on 
            t1.id+2 = t3.id
        and
            t3.data = 'SEX' 
    join 
            #tt t4 
        on 
            t1.id+3 = t4.id
    join
            #tt t5 
        on
            t1.id+4 = t5.id
        and
            t5.data = 'AGE'
    JOIN
            #tt t6
        on
            t1.id+5 = t6.id
    
    
    
    
     select * from #endResult
    

    【讨论】:

    • 你从哪里得到 t4 和 t6?
    • @bc004346 - t4 和 t6 与您的 t#s 的来源相同。它们是性别和年龄列的来源。虽然您的方法代码较少并且似乎可以工作,但您非常依赖以 ID 1 开头的行。我知道这是他的示例,但如果此表不是一次性问题并且有人不小心在任何地方添加了一行不符合确切的数字方案,您的查询将返回不正确的结果。
    • 换个说法,无论谁投了反对票,请评论原因。
    • 哦,是的,我错过了下游部分 - 看不到滚动条。这说得通。我认为,鉴于这个问题,假设数据可能是从某个地方导入的,并且 OP 不知道它的编号方式有任何违规行为是相当安全的。
    猜你喜欢
    • 1970-01-01
    • 2012-01-11
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2016-07-23
    • 1970-01-01
    • 2013-11-10
    相关资源
    最近更新 更多