Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zwracanie n-tej wartości z wyników lub NULL

Użyj ROW_NUMBER() . Najpierw przypisz każdemu rekordowi numer wiersza:

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;

Następnie możesz użyć tego RowNumber kolumna do PIVOT Twoje dane:

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;

EDYTUJ

Jeśli nie rozumiesz, to nie odpowiedziałem poprawnie! Mocno wierzę w przysłowie „daj człowiekowi rybę, a nakarmisz go przez jeden dzień; naucz człowieka łowić ryby, a nakarmisz go przez całe życie”

Jeśli masz następujące dane w swoich dwóch tabelach:

Atrybuty '

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

Atrybuty kontaktu z klientem

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

Uruchamianie następujących czynności:

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;

Da ci:

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

ROW_NUMBER() funkcja po prostu przypisuje unikalny numer do każdej grupy (zdefiniowanej w PARTITION BY klauzula), a liczba ta jest określona przez ORDER BY klauzula. więc ta linia:

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

Zasadniczo mówi, że dla każdej unikalnej wartości cca.ClientContactId Chciałbym uzyskać unikalny numer, zaczynając od 1, gdzie najniższa wartość attributeId otrzymuje 1, a stamtąd liczba wzrasta:

Funkcja PRZESTAWNA przypomina tabelę przestawną programu Excel, w której chcesz przekonwertować wiersze na kolumny. Składa się z dwóch zasadniczych części i tutaj będę pracował wstecz. Pierwsza część to FOR klauzula:

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

To są wartości z RowNumber kolumna, którą chcesz zamienić w wiersze. Nazwy kolumn będą odpowiadać podanym wartościom. Druga część (pierwsza logicznie czytana) definiuje wartości, które trafią do tych nowo utworzonych kolumn. Musi to być funkcja agregująca, w tym przypadku jest to:

MAX(Description)

Skoro już wiesz, że RowNumber jest unikalny dla każdego ClientContactId , funkcja agregująca (która jest wymagana dla PIVOT`) jest właściwie bez znaczenia, ponieważ istnieje tylko jedna wartość do agregowania opisu.

Mam nadzieję, że ma to trochę więcej sensu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Do czego służy operator &w SQL SERVER

  2. Zamień ciąg na inny ciąg w SQL Server (T-SQL)

  3. Łączenie się z serwerem SQL z Nodejs

  4. Model Entity Framework wiele-wiele plus relacja współdzielona

  5. SQL Server 2005 - Error_Message() nie wyświetla pełnego komunikatu