sql >> Database teknologi >  >> RDS >> Sqlserver

Returnerer n'te værdi fra resultater eller NULL

Brug ROW_NUMBER() . Tildel først hver post et rækkenummer:

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å kan du bruge dette RowNumber kolonne til PIVOT dine data:

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;

REDIGER

Hvis du ikke forstår, så har jeg ikke svaret ordentligt! Jeg tror fuldt og fast på ordsproget "giv en mand en fisk, og du fodrer ham for en dag; lær en mand at fiske, og du fodrer ham for hele livet"

Hvis du har følgende data i dine to tabeller:

Attributter '

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

ClientContactAttributes

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

Kører følgende:

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;

Vil give dig:

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

ROW_NUMBER() funktionen tildeler simpelthen et unikt nummer til hver gruppe (defineret i PARTITION BY klausul), og dette nummer bestemmes af ORDER BY klausul. så denne linje:

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

Siger i bund og grund for hver unik værdi af cca.ClientContactId Jeg vil gerne have et unikt nummer, der starter ved 1, hvor den laveste værdi af attributeId modtager 1 og antallet stiger derfra:

PIVOT-funktionen er meget som en excel-pivottabel, hvor du vil konvertere rækkerne til kolonner. Det har to grundlæggende dele, og jeg vil arbejde baglæns her. Den første del er FOR klausul:

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

Dette er værdierne fra RowNumber kolonne, som du vil lave om til rækker. Kolonnenavnene svarer til de angivne værdier. Den anden del (første logisk læsning), definerer de værdier, der vil gå ind i disse nyoprettede kolonner. Dette skal være en aggregeret funktion, og i dette tilfælde er det:

MAX(Description)

Da du allerede kender det RowNumber er unik for hver ClientContactId , er aggregeringsfunktionen (som er påkrævet for PIVOT`) faktisk meningsløs, da der kun er én værdi for beskrivelse at aggregere.

Forhåbentlig giver det lidt mere mening.




  1. Robolectric adgang til databasen giver en fejl

  2. Hvordan og hvornår bruges indekser i INSERT og UPDATE operationer?

  3. Oprettelse af indlejret JSON ved hjælp af PHP MySQL

  4. Postgres kan ikke åbne CSV-fil for læseadgang:Tilladelse nægtet