Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cara mengubah data dari baris berdasarkan kolom tertentu ke struktur data lain

Anda dapat menggunakan unpivot/pivot untuk mendapatkan hasil yang Anda inginkan. Ada beberapa cara berbeda untuk mendapatkan hasilnya, jika Anda memiliki jumlah nilai yang terbatas maka Anda dapat membuat hard-code kueri tersebut tetapi jika Anda memiliki jumlah nilai yang tidak diketahui maka Anda perlu menggunakan SQL dinamis.

Proses UNPIVOT akan mengonversi beberapa kolom c1 , dll` menjadi beberapa baris. Setelah data berada dalam beberapa baris maka Anda dapat dengan mudah menerapkan fungsi PIVOT. Anda dapat menggunakan fungsi unpivot atau CROSS APPLY untuk mengonversi data dari beberapa kolom:

select id,
  col = 'Service'+Service+'_'+col+'_'+cast(seq as varchar(10)),
  value
from
(
  select id, service, c1, cn
    , row_number() over(partition by id
                        order by service) seq
  from yourtable
) t
cross apply
(
  select 'c1', c1 union all
  select 'cn', cn
) c (col, value)

Lihat SQL Fiddle dengan Demo . Tanda silang akan mengubah data Anda menjadi format:

| ID |           COL | VALUE |
|  1 | ServiceA_c1_1 |     5 |
|  1 | ServiceA_cn_1 |     3 |
|  1 | ServiceB_c1_2 |     2 |
|  1 | ServiceB_cn_2 |     1 |
|  2 | ServiceA_c1_1 |     9 |
|  2 | ServiceA_cn_1 |     4 |

Setelah data dalam format ini, Anda dapat menerapkan PIVOT:

select id, ServiceA_c1_1, ServiceA_cn_1,
  ServiceB_c1_2, ServiceB_cn_2
from
(
  select id,
    col = 'Service'+Service+'_'+col+'_'+cast(seq as varchar(10)),
    value
  from
  (
    select id, service, c1, cn
      , row_number() over(partition by id
                          order by service) seq
    from yourtable
  ) t
  cross apply
  (
    select 'c1', c1 union all
    select 'cn', cn
  ) c (col, value)
) d
pivot
(
  max(value)
  for col in (ServiceA_c1_1, ServiceA_cn_1,
              ServiceB_c1_2, ServiceB_cn_2)
) piv;

Lihat SQL Fiddle dengan Demo .

Kemudian jika Anda memiliki jumlah nilai yang tidak diketahui, Anda dapat mengonversi kueri di atas menjadi SQL dinamis:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME('Service'+Service+'_'+col+'_'+cast(seq as varchar(10))) 
                    from 
                    (
                      select service, 
                        row_number() over(partition by id
                                          order by service) seq
                      from yourtable 
                    )d
                    cross apply
                    (
                      select 'c1', 1 union all
                      select 'cn', 2
                    ) c (col, so)
                    group by seq, Service, col, so
                    order by seq, so
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT id, ' + @cols + ' 
            from 
            (
              select id,
                col = ''Service''+Service+''_''+col+''_''+cast(seq as varchar(10)),
                value
              from
              (
                select id, service, c1, cn
                  , row_number() over(partition by id
                                      order by service) seq
                from yourtable
              ) t
              cross apply
              (
                select ''c1'', c1 union all
                select ''cn'', cn
              ) c (col, value)
            ) x
            pivot 
            (
                max(value)
                for col in (' + @cols + ')
            ) p '

execute sp_executesql @query;

Lihat SQL Fiddle dengan Demo . Keduanya akan memberikan hasil:

| ID | SERVICEA_C1_1 | SERVICEA_CN_1 | SERVICEB_C1_2 | SERVICEB_CN_2 |
|  1 |             5 |             3 |             2 |             1 |
|  2 |             9 |             4 |        (null) |        (null) |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mensimulasikan UNPIVOT di Access?

  2. Ukuran maksimum untuk Kueri SQL Server? klausa IN? Apakah ada Pendekatan yang Lebih Baik?

  3. Cara:Membuat pemicu untuk tanggal modifikasi pembaruan otomatis dengan SQL Server 2008

  4. Mana yang lebih cepat COALESCE ATAU ISNULL?

  5. Nilai yang Dipisahkan Koma dengan SQL Query