sql >> Databáze >  >> RDS >> Sqlserver

Vrací n-tou hodnotu z výsledků nebo NULL

Použijte ROW_NUMBER() . Nejprve přiřaďte každému záznamu číslo řádku:

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;

Pak můžete použít toto RowNumber sloupec do PIVOT vaše údaje:

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;

UPRAVIT

Pokud nerozumíte, neodpověděl jsem správně! Pevně ​​věřím v přísloví "dej člověku rybu a nasytíš ho na jeden den; nauč člověka rybařit a nasytíš ho na celý život"

Pokud máte ve svých dvou tabulkách následující údaje:

Atributy '

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

ClientContactAttributes

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

Spuštění následujícího:

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;

Dá vám:

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

ROW_NUMBER() funkce jednoduše přiřadí každé skupině jedinečné číslo (definované v PARTITION BY klauzule) a toto číslo je určeno ORDER BY doložka. takže tento řádek:

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

V podstatě říká, že pro každou jedinečnou hodnotu cca.ClientContactId Chtěl bych jedinečné číslo začínající na 1, kde je nejnižší hodnota attributeId obdrží 1 a odtamtud se číslo zvýší:

Funkce PIVOT je podobná kontingenční tabulce Excel, kde chcete převést řádky na sloupce. Má dvě základní části a zde budu pracovat zpětně. První část je FOR klauzule:

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

Toto jsou hodnoty z RowNumber sloupec, který chcete změnit na řádky. Názvy sloupců budou odpovídat zadaným hodnotám. Druhá část (první logicky čtení) definuje hodnoty, které budou vstupovat do těchto nově vytvořených sloupců. Musí to být agregační funkce a v tomto případě to je:

MAX(Description)

Protože už víte, že RowNumber je jedinečný pro každé ClientContactId , agregační funkce (která je vyžadována pro PIVOT`) ve skutečnosti nemá smysl, protože pro popis existuje pouze jedna hodnota, kterou lze agregovat.

Snad to dává trochu větší smysl.




  1. Vrátí datové řádky z bloku pl/sql

  2. w3wp.exe vysoká síť při volání databáze

  3. Jak používat fond připojení s java, MySQL a Tomcat 6

  4. Vrácení hodnoty 0 z řádku databáze v PHP/MySQL po dotazu