通过将行转换为列来重新组织访问表

时间:2016-10-26 19:21:39

标签: sql sql-server ms-access transform

我很擅长访问和SQL,需要一些帮助重新组织一个表。我有下表(对不起下面的表 - 发布有问题):

(df.loc[:,0] == "PRAM") & (df.loc[:,2] == "CM")
Out[2]:
0    False
1    False
2    False
3    False
4     True
5    False
dtype: bool

df.loc[(df.loc[:,0] == "PRAM") & (df.loc[:,2] == "CM"), :]
Out[3]:
      0     1   2   3   4   5   6
4  PRAM  1231  CM  12 NaN NaN NaN

需要将表转换为:

ID   GroupID  Distance  Code  Start_Finish
1   44       7         A     S1
2   44       14        A     F1
3   45       12        B     S1
4   45       16        B     F1
5   45       31        C     S2
6   45       36        C     F2
7   45       81        B     S3
8   45       88        B     F3 

2 个答案:

答案 0 :(得分:0)

尝试这样的事情

Select GroupID, Code, min(distance) as Start_distance, max(distance) as Finish_distance
from Table
group by GroupID, Code

如果min和max函数不能满足您的需要,请尝试使用First()和Last()代替。

糟糕 - 只是注意到GroupID 45代码B的输出中有2个不同的条目 - 这是一个要求吗?有了这种数据结构和要求,问题就变得更加困难了。

现在我看到第一个表中的最后一列 - 我认为可以用来获得你想要的输出:

Select GroupID, Code, mid(start_finish,2) as T, min(distance) as Start_distance, max(distance) as Finish_distance
from Table
group by GroupID, Code, T

答案 1 :(得分:0)

您可以使用条件聚合。

select GroupID
    , CODE
    , max(case when Left(Start_Finish, 1) = 'S' then Distance end) as Start_Distance
    , max(case when Left(Start_Finish, 1) = 'F' then Distance end) as Finish_Distance
from SomeTable
group by GroupID
    , CODE