sql >> Database >  >> RDS >> Sqlserver

N-de waarde retourneren uit resultaten of NULL

Gebruik ROW_NUMBER() . Wijs eerst aan elk record een rijnummer toe:

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;

Dan kun je dit RowNumber . gebruiken kolom naar PIVOT uw gegevens:

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;

BEWERKEN

Als je het niet begrijpt, heb ik niet goed geantwoord! Ik geloof heilig in het spreekwoord "geef een man een vis en je voedt hem voor een dag; leer een man vissen en je voedt hem een ​​leven lang"

Als u de volgende gegevens in uw twee tabellen heeft:

Kenmerken '

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

ClientContactAttributes

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

Het volgende uitvoeren:

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;

Zal je geven:

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

De ROW_NUMBER() functie wijst eenvoudig een uniek nummer toe aan elke groep (gedefinieerd in de PARTITION BY clausule), en dit aantal wordt bepaald door de ORDER BY clausule. dus deze regel:

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

Zegt in wezen, voor elke unieke waarde van cca.ClientContactId Ik wil graag een uniek nummer, beginnend bij 1, waarbij de laagste waarde van attributeId ontvangt 1 en het nummer wordt vanaf daar verhoogd:

De PIVOT-functie lijkt veel op een Excel-draaitabel, waar u de rijen naar kolommen wilt converteren. Het heeft twee fundamentele delen en ik zal hier achteruit werken. Het eerste deel is de FOR clausule:

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

Dit zijn de waarden van het RowNumber kolom die u in rijen wilt veranderen. De kolomnamen komen overeen met de opgegeven waarden. Het tweede deel (eerste logische lezing) definieert de waarden die in deze nieuw aangemaakte kolommen zullen worden geplaatst. Dit moet een geaggregeerde functie zijn, en in dit geval is het:

MAX(Description)

Omdat je al weet dat RowNumber is uniek voor elke ClientContactId , de aggregatiefunctie (die vereist is voor PIVOT`) is eigenlijk zinloos, omdat er maar één waarde is voor de beschrijving om te aggregeren.

Hopelijk is dit een beetje logischer.




  1. Query's dynamisch maken in rails

  2. Een tabel bijwerken op basis van een XML-parameter

  3. Welke gebruiker moet /usr/local/mysql op Mac bezitten?

  4. Maak Java op Oracle-database met JDBC