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

Pilih nilai kolom sebagai kolom menggunakan PIVOT

Persyaratan Anda tidak sepenuhnya jelas tetapi sepertinya Anda mencoba membuat kolom baru bernama c dengan kemudian row_number() terkait dengannya -- c1, c2 c3, etc .

Jika Anda menggunakan yang berikut ini dalam subkueri Anda:

SELECT Val1, Val2,
  'C'+ cast(row_number() over(partition by Val2 
                              order by val1) as varchar(10)) col
FROM TEMP1

Lihat SQL Fiddle dengan Demo

Anda akan mendapatkan hasilnya:

| VAL1 |  VAL2 | COL |
----------------------
|  S01 | 00731 |  C1 |
|  S02 | 00731 |  C2 |
|  S03 | 00731 |  C3 |
|  S04 | 00731 |  C4 |
|  S05 | 00731 |  C5 |
|  S06 | 00731 |  C6 |
|  S07 | 00731 |  C7 |
|  S07 | 00731 |  C8 |
|  S08 | 00731 |  C9 |
|  S09 | 00731 | C10 |
|  S04 | 00741 |  C1 |
|  S01 | 00746 |  C1 |
|  S01 | 00770 |  C1 |
|  S01 | 00771 |  C1 |
|  S02 | 00771 |  C2 |

Yang tampaknya merupakan hasil yang Anda inginkan untuk PIVOT . Anda kemudian akan menerapkan PIVOT untuk ini menggunakan:

SELECT Val2,
   c1, c2, c3, c4, c5, c6, c7, c8, c9, c10
FROM
(
  SELECT Val1, Val2,
    'C'+ cast(row_number() over(partition by Val2 
                                order by val1) as varchar(10)) col
  FROM TEMP1
) src
PIVOT
(
  MAX(Val1)
  FOR col IN (C1, C2, C3, C4, C5, C6, C7, C8, C9, C10)
) piv;

Lihat SQL Fiddle dengan Demo . Hasil akhir Anda adalah:

|  VAL2 |  C1 |     C2 |     C3 |     C4 |     C5 |     C6 |     C7 |     C8 |     C9 |    C10 |
------------------------------------------------------------------------------------------------
| 00731 | S01 |    S02 |    S03 |    S04 |    S05 |    S06 |    S07 |    S07 |    S08 |    S09 |
| 00741 | S04 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00746 | S01 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00770 | S01 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00771 | S01 |    S02 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |

Catatan:hasil saya sedikit berbeda dari apa yang Anda minta sebagai hasil yang diinginkan karena saya melakukan ORDER BY val1 yang menyebabkan S07 nilai untuk dikelompokkan bersama.

Tidak ada urutan data dalam database kecuali Anda memintanya, jadi tidak ada jaminan bahwa salah satu dari S07 nilai akan muncul sebagai C10 . Anda dapat menggunakan yang berikut ini untuk mendapatkan hasilnya tetapi tidak ada jaminan bahwa hasilnya akan selalu dalam urutan yang benar:

SELECT Val2,
  c1, c2, c3, c4, c5, c6, c7, c8, c9, c10
FROM
(
  SELECT Val1, Val2,
    'C'+ cast(row_number() over(partition by Val2 
                                order by (select 1)) as varchar(10)) col
  FROM TEMP1
) src
PIVOT
(
  MAX(Val1)
  FOR col IN (C1, C2, C3, C4, C5, C6, C7, C8, C9, C10)
) piv;

Lihat SQL Fiddle dengan Demo . Menggunakan order by (select 1) mengubah urutan data tetapi tidak menjamin bahwa itu akan selalu dalam urutan itu. Hasilnya adalah:

|  VAL2 |  C1 |     C2 |     C3 |     C4 |     C5 |     C6 |     C7 |     C8 |     C9 |    C10 |
------------------------------------------------------------------------------------------------
| 00731 | S01 |    S02 |    S03 |    S04 |    S05 |    S06 |    S07 |    S08 |    S09 |    S07 |
| 00741 | S04 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00746 | S01 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00770 | S01 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00771 | S01 |    S02 | (null) | (null) | (null) | (null) | (null) | (null) | (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. Perbandingan kinerja SQL Server CE 4.0

  2. Temukan baris terakhir dalam grup berdasarkan kueri-SQL Server

  3. Dari .NET saya bisa mendapatkan string SQL lengkap yang dihasilkan oleh objek SqlCommand (dengan Parameter SQL)?

  4. Ubah Tipe Data Waktu menjadi Format AM PM:

  5. Sintaks salah di dekat ')' memanggil prosedur tersimpan dengan GETDATE