sort results by column not row

后端 未结 3 1162
长情又很酷
长情又很酷 2021-01-18 08:35

is it possible in SQL to sort by column and not by row? i do not need a basic ORDER BY statement, i know how those work (ie: order by column1, column2, etc).

basic

3条回答
  •  抹茶落季
    2021-01-18 09:24

    Here is relatively simple way to sort columns. If you first unpivot, sort and pivot your data, you will get sorted columns.

    Here is Sql Fiddle with example.

    -- Assign arbitrary numbers to records
    -- You might skip this part if you have unique column
    -- in which case you should replace RecordNumber with this ID
    ; with numbered as
    (
      select *,
             row_number() over (order by (select null)) RecordNumber
        from test
    ),
    -- Generate order by
    -- For all the columns in record.
    -- Rn will always be in range
    -- 1..NumberOfColumns
    -- Order is done on unpivoted data
    ordered as
    (
      select *,
             row_number() over (partition by RecordNumber
                                order by v desc) rn
        from numbered
     -- list all the columns here
     -- v is for value
     -- c is for column
     unpivot (v for c in (c1, c2, c3)) u
    )
    -- Finally return the data in original layout
    select RecordNumber,
           [1] c1,
           [2] c2,
           [3] c3
      from 
      (
        -- Only the columns needed by the query
        -- Pivot will not play nice even if you
        -- Select only subset of columns in
        -- outer query
        select RecordNumber,
               v,
               Rn
          from ordered
      ) o
     -- Get value for row numbers 1..NumberOfColumns
     pivot (min(v) for Rn in ([1], [2], [3])) p
    

    You might want to add header rows so you would know which value come from which column. To do this I would add a column identifying header/row, union all to o to get corresponding headers and order by which would ensure that these two rows stay together:

      (
        select RecordNumber,
               v,
               Rn,
               1 HdrRow
          from ordered
         union all
        select RecordNumber,
               c,    -- Column name is in c
               Rn,
               0 HdrRow
          from ordered
      ) o
        ...
      order by RecordNumber, HdrRow
    

提交回复
热议问题