Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

sortuj wyniki według kolumny, a nie wiersza

Oto stosunkowo prosty sposób sortowania kolumn. Jeśli najpierw unpivot , sortuj i przestaw Twoje dane, otrzymasz posortowane kolumny.

Oto Sql Fiddle z przykładem .

-- 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

Możesz dodać wiersze nagłówka, aby wiedzieć, która wartość pochodzi z której kolumny. Aby to zrobić, dodałbym kolumnę identyfikującą nagłówek/wiersz, union all do o aby uzyskać odpowiednie nagłówki i kolejność, według której te dwa wiersze pozostaną razem:

  (
    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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Co mogę zrobić, aby poprawić wydajność mojej czystej funkcji zdefiniowanej przez użytkownika w programie SQL Server?

  2. Usuń dane za pomocą funkcji wartościującej tabelę w SQL Server

  3. Nie można połączyć się z bazą danych SQL Server w programie Visual Studio, ponieważ nie ma tam mojej bazy danych

  4. Jak w SQL można grupować według zakresów?

  5. Obejście maksymalnego limitu kolumn SQL Server 1024 i 8kb rozmiaru rekordu