Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Trả về giá trị thứ n từ kết quả hoặc NULL

Sử dụng ROW_NUMBER() . Đầu tiên, gán cho mỗi bản ghi một số hàng:

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;

Sau đó, bạn có thể sử dụng RowNumber này cột thành PIVOT dữ liệu của bạn:

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;

CHỈNH SỬA

Nếu bạn chưa hiểu thì mình trả lời chưa đúng! Tôi là một người tin tưởng chắc chắn vào câu tục ngữ "cho một người một con cá và bạn cho anh ta ăn một ngày; dạy một người câu cá và bạn nuôi anh ta suốt đời"

Nếu bạn có dữ liệu sau trong hai bảng của mình:

Thuộc tính '

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

ClientContactAttributes

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

Chạy như sau:

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;

Sẽ cung cấp cho bạn:

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

ROW_NUMBER() hàm chỉ cần gán một số duy nhất cho mỗi nhóm (được định nghĩa trong PARTITION BY ), và con số này được xác định bởi ORDER BY mệnh đề. vì vậy dòng này:

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

Về cơ bản là nói, đối với mỗi giá trị duy nhất của cca.ClientContactId Tôi muốn một số duy nhất, bắt đầu từ 1, trong đó giá trị thấp nhất của attributeId nhận 1 và số gia tăng từ đó:

Hàm PIVOT, giống như một bảng tổng hợp excel, nơi bạn muốn chuyển các hàng thành cột. Nó có hai phần cơ bản và tôi sẽ làm việc ngược lại ở đây. Phần đầu tiên là FOR mệnh đề:

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

Đây là các giá trị từ RowNumber cột mà bạn muốn chuyển thành hàng. Các tên cột sẽ tương ứng với các giá trị được cung cấp. Phần thứ hai (đọc một cách logic đầu tiên), xác định các giá trị sẽ đi vào các cột mới được tạo này. Đây phải là một hàm tổng hợp và trong trường hợp này, nó là:

MAX(Description)

Vì bạn đã biết rằng RowNumber là duy nhất cho mỗi ClientContactId , hàm tổng hợp (được yêu cầu cho PIVOT`) thực sự vô nghĩa, vì chỉ có một giá trị cho mô tả để tổng hợp.

Hy vọng rằng điều này có ý nghĩa hơn một chút.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn SQL để giải quyết các bế tắc trong SQL SERVER 2008

  2. Dấu ngoặc kép t-sql động trong chuỗi

  3. SQL Server:Thay đổi cơ sở dữ liệu hiện tại thông qua biến

  4. Khắc phục sự cố Microsoft SQL Server Error 18456

  5. Làm cách nào để viết tên cột có dấu chấm (.) Trong mệnh đề SELECT?