Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Връща n-та стойност от резултатите или NULL

Използвайте ROW_NUMBER() . Първо присвоете на всеки запис номер на ред:

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;

След това можете да използвате този RowNumber колона към PIVOT вашите данни:

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;

РЕДАКТИРАНЕ

Ако не разбирате, значи не съм отговорил правилно! Твърдо вярвам в поговорката "дай на човек риба и ще го нахраниш за един ден; научи го да лови риба и ще го нахраниш за цял живот"

Ако имате следните данни в двете си таблици:

Атрибути '

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

ClientContactAttributes

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

Изпълнение на следното:

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;

Ще ви даде:

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

ROW_NUMBER() функцията просто присвоява уникален номер на всяка група (дефинирана в PARTITION BY клауза) и този номер се определя от ORDER BY клауза. така че този ред:

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

По същество се казва, за всяка уникална стойност на cca.ClientContactId Бих искал уникален номер, започващ от 1, където е най-ниската стойност на attributeId получава 1 и числото се увеличава оттам:

Функцията PIVOT е много подобна на обобщена таблица на Excel, където искате да конвертирате редовете в колони. Има две основни части и тук ще работя отзад напред. Първата част е FOR клауза:

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

Това са стойностите от RowNumber колона, която искате да превърнете в редове. Имената на колоните ще съответстват на предоставените стойности. Втората част (първото логическо четене) дефинира стойностите, които ще влязат в тези новосъздадени колони. Това трябва да е агрегатна функция и в този случай е:

MAX(Description)

Тъй като вече знаете, че RowNumber е уникален за всеки ClientContactId , обобщителната функция (която е необходима за PIVOT`) всъщност е безсмислена, тъй като има само една стойност за описание за агрегиране.

Надяваме се, че това има малко повече смисъл.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изтривайте само записи, по-стари от 50 реда, докато групирате по 1 колона

  2. какви са настройките на системния регистър за активиране на TCP на SQL Server 2005 и 2008?

  3. SQL заявка за верига родител-дете

  4. Върнете всички външни ключове, които препращат към дадена таблица в SQL Server

  5. SQL Server - Кумулативна сума, която се нулира, когато се срещне 0