【问题标题】:convert Rows to Columns in SQL with same ID在 SQL 中将行转换为具有相同 ID 的列
【发布时间】:2018-05-02 18:25:29
【问题描述】:

伙计们,

我有一个表格,数据如下。

enter image description here

请建议应用 sql 逻辑来实现此输出。

【问题讨论】:

  • 你如何决定哪一行是 Flag1/2 &Flag3/4?

标签: sql teradata


【解决方案1】:

一种方法是使用条件聚合:

select travelid,
       max(case when seqnum = 1 then earn end) as earn,
       max(case when seqnum = 1 then burn end) as burn,
       max(case when seqnum = 2 then earn end) as earnA,
       max(case when seqnum = 2 then burn end) as burnB
from (select t.*, row_number() over (partition by travelid order by travelid) as seqnum
      from t
     ) t
group by travelid

【讨论】:

    【解决方案2】:

    SQL Server 动态版:

    --TEST DATA
    CREATE TABLE #TestTable
        ([TravelID] int, [SitelD] int, [Flagi] int, [FIag2] int)
    ;
    
    INSERT INTO #TestTable
        ([TravelID], [SitelD], [Flagi], [FIag2])
    VALUES
        (1001, 1, 1, 0),(1001, 1, 0, 1),(1001, 1, 3, 4),
        (1002, 1, 1, 0),(1002, 2, 0, 1),(1002, 2, 3, 4)
    ;
    
    
    --STEP 1 rank data
    SELECT * into #rank_table from (
        select  *
        ,ROW_NUMBER() OVER (PARTITION BY [TravelID],[SitelD] order by [SitelD]) [rank]
        from (
            select * from #TestTable
        ) T100    
    )T;
    
    --STEP 2 Group by row_count
    SELECT * into #group_table from (
        select [TravelID],[SitelD] ,count(1) [count]
        from #TestTable T
        group by [TravelID],[SitelD]
    )T;
    
    --Use Exec
    DECLARE @select_sql AS NVARCHAR(MAX) = ' select  T.[TravelID], T.[SitelD] ',
    @join_sql AS NVARCHAR(MAX) = ' from #group_table T ',
    @max_count INT = (SELECT max([count]) FROM #group_table),
    @temp_string NVARCHAR(5),
    @temp_string_addone NVARCHAR(5)
    ;
    
    DECLARE @index int = 0 ;
    WHILE @index < @max_count
    BEGIN
        sELECT @temp_string = Convert(nvarchar(10),@index);
       sELECT @temp_string_addone = Convert(nvarchar(10),@index+1);
       select  @select_sql = @select_sql + ' , T'+@temp_string_addone+'.[Flagi] as Flag'+Convert(nvarchar(10),2*@index+1)+' '
        + ' , T'+@temp_string_addone+'.[FIag2] as Flag'+Convert(nvarchar(10),2*@index+2)+' ';
       select  @join_sql = @join_sql + 'left join #rank_table T'+@temp_string_addone+' on ' + ' T.[TravelID] = T'+@temp_string_addone+'.[TravelID] and '
       + ' T.[SitelD] = T'+@temp_string_addone+'.[SitelD] and '
       + 'T'+@temp_string_addone+'.[rank] = '+@temp_string_addone+' ';
       SET @index = @index + 1;
    END;
    
    EXEC (@select_sql
    + @join_sql
    +' order by [TravelID],[SitelD] ; ')
    ;
    


    演示:convert Rows to Columns in SQL with same ID, Sql Server - rextester

    【讨论】:

      【解决方案3】:
      with CTE as(
          select 
          *
          ,ROW_NUMBER() OVER (PARTITION BY [TravelID],[SitelD] order by [SitelD]) [rk]
          from [Table]
      )
      select distinct a.[TravelID], a.[SitelD], a.[Flagi] as Flag1, a.[FIag2] as Flag1, b.[Flagi] as Flag3, b.[FIag2] as Flag4
      from (select * from CTE where [rk] = 1) a
      left join (select * from CTE where [rk] = 2) b on a.[TravelID] = b.[TravelID] and  a.[SitelD] =  + b.[SitelD]
      

      【讨论】:

        猜你喜欢
        • 2012-08-04
        • 1970-01-01
        • 2014-01-10
        • 2015-09-23
        • 1970-01-01
        • 1970-01-01
        • 2022-07-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多