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

Mengembalikan nilai ke-n dari hasil atau NULL

Gunakan ROW_NUMBER() . Pertama-tama tetapkan setiap record sebuah nomor baris:

SELECT  cca.ClientContactId,
        a.Description,
        RowNumber = ROW_NUMBER() OVER(PARTITION BY cca.ClientContactId 
                                        ORDER BY a.AttributeId)
FROM    ClientContactAttributes AS cca
        INNER JOIN Attributes AS a
            ON a.AttributeId = cca.AttributeId;

Kemudian Anda dapat menggunakan RowNumber ini kolom ke PIVOT data Anda:

WITH Data AS
(   SELECT  cca.ClientContactId,
            a.Description,
            RowNumber = ROW_NUMBER() OVER(PARTITION BY cca.ClientContactId 
                                            ORDER BY a.AttributeId)
    FROM    ClientContactAttributes AS cca
            INNER JOIN Attributes AS a
                ON a.AttributeId = cca.AttributeId
)
SELECT  pvt.ClientContactID,
        Attribute1 = pvt.[1],
        Attribute2 = pvt.[2],
        Attribute3 = pvt.[3],
        Attribute4 = pvt.[4]
FROM    Data
        PIVOT
        (   MAX(Description)
            FOR RowNumber IN ([1], [2], [3], [4])
        ) AS pvt;

EDIT

Jika Anda tidak mengerti maka saya belum menjawab dengan benar! Saya sangat percaya pada pepatah "beri seseorang ikan dan Anda memberinya makan selama sehari; ajari seseorang memancing dan Anda memberinya makan seumur hidup"

Jika Anda memiliki data berikut dalam dua tabel Anda:

Atribut '

AttributeId | Description
------------+---------------
    1       |     Bed          
    2       |     Bath        
    3       |    Beyond 

ClientContactAttributes

ClientContactID | AttributeId
----------------+---------------
       1        |    1
       1        |    2
       1        |    3
       2        |    1

Menjalankan yang berikut:

SELECT  cca.ClientContactId,
        a.Description,
        RowNumber = ROW_NUMBER() OVER(PARTITION BY cca.ClientContactId 
                                        ORDER BY a.AttributeId)
FROM    ClientContactAttributes AS cca
        INNER JOIN Attributes AS a
            ON a.AttributeId = cca.AttributeId;

Akan memberi Anda:

ClientContactID | Description | RowNumber
----------------+-------------+-----------
       1        |     Bed     |     1
       1        |     Bath    |     2
       1        |    Beyond   |     3
       2        |     Bed     |     1

ROW_NUMBER() fungsi hanya memberikan nomor unik untuk setiap grup (didefinisikan dalam PARTITION BY klausa), dan nomor ini ditentukan oleh ORDER BY ayat. jadi baris ini:

ROW_NUMBER() OVER(PARTITION BY cca.ClientContactId ORDER BY a.AttributeId)

Pada dasarnya mengatakan, untuk setiap nilai unik cca.ClientContactId Saya ingin nomor unik, mulai dari 1, di mana nilai terendah attributeId menerima 1 dan angka bertambah dari sana:

Fungsi PIVOT, sangat mirip dengan tabel pivot excel, di mana Anda ingin mengubah baris menjadi kolom. Ini memiliki dua bagian mendasar, dan saya akan bekerja mundur di sini. Bagian pertama adalah FOR klausa:

FOR RowNumber IN ([1], [2], [3], [4])

Ini adalah nilai dari RowNumber kolom yang ingin Anda ubah menjadi baris. Nama kolom akan sesuai dengan nilai yang diberikan. Bagian kedua (pertama membaca secara logis), mendefinisikan nilai yang akan masuk ke kolom yang baru dibuat ini. Ini harus menjadi fungsi agregat, dan dalam hal ini adalah:

MAX(Description)

Karena Anda sudah tahu bahwa RowNumber unik untuk setiap ClientContactId , fungsi agregat (yang diperlukan untuk PIVOT`) sebenarnya tidak ada artinya, karena hanya ada satu nilai untuk deskripsi yang akan digabungkan.

Semoga ini sedikit lebih masuk akal.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Instalasi SQL Server 2008

  2. Apakah lebih baik menggunakan pengenal unik (GUID) atau bigint untuk kolom identitas?

  3. Lewati jenis nilai tabel ke prosedur tersimpan SQL Server melalui Entity Framework

  4. Masukkan ke dalam tabel dari variabel tabel?

  5. Konversi Implisit Format Sumber SSIS untuk Datetime