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

Tidak dapat memutar tabel dengan kueri saya?

Hanya untuk memperluas jawaban lain, fungsi PIVOT memerlukan beberapa jenis agregasi. Karena nilai yang ingin Anda ubah dari baris menjadi kolom adalah string, maka Anda dibatasi untuk menggunakan max() atau min() fungsi agregat.

Sementara @Muhammed Ali jawaban akan berfungsi ketika Anda memiliki satu AttributeName /AttributeValue pair, jika Anda memiliki beberapa pasangan untuk setiap ID , maka Anda hanya akan mengembalikan max atau min nilai.

Misalnya jika data sampel Anda adalah:

INSERT INTO @MyTable VALUES ('A1', 'Atr1', 'A1V1');
INSERT INTO @MyTable VALUES ('A1', 'Atr1', 'A1V4');
INSERT INTO @MyTable VALUES ('A1', 'Atr2', 'A1V2');
INSERT INTO @MyTable VALUES ('A1', 'Atr3', 'A1V3');
INSERT INTO @MyTable VALUES ('A2', 'Atr1', 'A2V1');
INSERT INTO @MyTable VALUES ('A2', 'Atr2', 'A2V2');
INSERT INTO @MyTable VALUES ('A2', 'Atr3', 'A3V3');

Meskipun Anda memiliki beberapa baris untuk kombinasi A1 dan Atr1 , kueri lainnya hanya mengembalikan max(attributevalue) :

| ID | ATR1 | ATR2 | ATR3 |
|----|------|------|------|
| A1 | A1V4 | A1V2 | A1V3 |
| A2 | A2V1 | A2V2 | A3V3 |

Saya kira Anda benar-benar ingin mengembalikan semua kombinasi. Saya sarankan memperluas kueri Anda untuk memasukkan fungsi windowing, row_number() dalam kueri Anda. Kueri ini menghasilkan nilai unik yang kemudian akan disertakan dalam aspek pengelompokan PIVOT dan memungkinkan Anda mengembalikan lebih dari satu baris untuk setiap ID.

Dengan menambahkan row_number() , kuerinya akan mirip dengan yang berikut:

SELECT Id, [Atr1], [Atr2],[Atr3]
FROM
( 
  SELECT ID, AttributeName, AttributeValue,
    row_number() over(partition by id, attributename
                      order by attributevalue) seq
  FROM @MyTable
) AS SourceTable 
PIVOT 
(
    max(AttributeValue)
    FOR AttributeName IN ([ATR1], [ATR2], [ATR3])
) AS pvt
order by id;

Lihat SQL Fiddle dengan Demo . Anda akan mendapatkan hasil yang mengembalikan semua baris:

| ID | ATR1 |   ATR2 |   ATR3 |
|----|------|--------|--------|
| A1 | A1V1 |   A1V2 |   A1V3 |
| A1 | A1V4 | (null) | (null) |
| A2 | A2V1 |   A2V2 |   A3V3 |

Jika Anda mengalami kesulitan dalam memahami konsep PIVOT, maka saya sarankan untuk menggunakan kombinasi fungsi agregat dengan ekspresi CASE untuk mendapatkan hasilnya. Anda kemudian dapat melihat pengelompokan urutan/id:

SELECT Id, 
  max(case when attributename = 'Atr1' then attributevalue end) Atr1,
  max(case when attributename = 'Atr2' then attributevalue end) Atr2,
  max(case when attributename = 'Atr3' then attributevalue end) Atr3
FROM
( 
  SELECT ID, AttributeName, AttributeValue,
    row_number() over(partition by id, attributename
                      order by attributevalue) seq
  FROM @MyTable
) AS SourceTable 
group by id, seq

Lihat SQL Fiddle dengan Demo



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server mengembalikan kesalahan Login gagal untuk pengguna 'NT AUTHORITY\ANONYMOUS LOGON'. di aplikasi Windows

  2. Buat Indeks pada Kolom CHAR parsial

  3. Cara Mereferensikan Kunci JSON yang Mengandung Karakter Khusus saat menggunakan OPENJSON, JSON_QUERY, dan JSON_VALUE (SQL Server)

  4. Apakah SELECT COUNT(column) lebih cepat/lebih lambat dari SELECT COUNT(*)?

  5. Konversi string dengan ekspresi ke desimal