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

Wybierz wartości kolumn jako kolumny za pomocą PIVOT

Twoje wymagania nie są do końca jasne, ale wygląda na to, że próbujesz utworzyć nową kolumnę o nazwie c z następnie row_number() powiązane z nim -- c1, c2 c3, etc .

Jeśli w podzapytaniu użyjesz następujących informacji:

SELECT Val1, Val2,
  'C'+ cast(row_number() over(partition by Val2 
                              order by val1) as varchar(10)) col
FROM TEMP1

Zobacz SQL Fiddle z wersją demonstracyjną

Otrzymasz wynik:

| VAL1 |  VAL2 | COL |
----------------------
|  S01 | 00731 |  C1 |
|  S02 | 00731 |  C2 |
|  S03 | 00731 |  C3 |
|  S04 | 00731 |  C4 |
|  S05 | 00731 |  C5 |
|  S06 | 00731 |  C6 |
|  S07 | 00731 |  C7 |
|  S07 | 00731 |  C8 |
|  S08 | 00731 |  C9 |
|  S09 | 00731 | C10 |
|  S04 | 00741 |  C1 |
|  S01 | 00746 |  C1 |
|  S01 | 00770 |  C1 |
|  S01 | 00771 |  C1 |
|  S02 | 00771 |  C2 |

Co wydaje się być wynikiem, który chcesz następnie PIVOT . Następnie zastosujesz PIVOT do tego za pomocą:

SELECT Val2,
   c1, c2, c3, c4, c5, c6, c7, c8, c9, c10
FROM
(
  SELECT Val1, Val2,
    'C'+ cast(row_number() over(partition by Val2 
                                order by val1) as varchar(10)) col
  FROM TEMP1
) src
PIVOT
(
  MAX(Val1)
  FOR col IN (C1, C2, C3, C4, C5, C6, C7, C8, C9, C10)
) piv;

Zobacz Skrzypce SQL z wersją demonstracyjną . Twój końcowy wynik to wtedy:

|  VAL2 |  C1 |     C2 |     C3 |     C4 |     C5 |     C6 |     C7 |     C8 |     C9 |    C10 |
------------------------------------------------------------------------------------------------
| 00731 | S01 |    S02 |    S03 |    S04 |    S05 |    S06 |    S07 |    S07 |    S08 |    S09 |
| 00741 | S04 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00746 | S01 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00770 | S01 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00771 | S01 |    S02 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |

Uwaga:moje wyniki różnią się nieco od żądanych wyników, ponieważ wykonuję ORDER BY val1 co powoduje S07 wartości do zgrupowania.

Nie ma kolejności danych w bazie danych, chyba że o to poprosisz, więc nie ma gwarancji, że jeden z S07 wartości pojawią się jako C10 . Aby uzyskać wynik, możesz użyć następujących elementów, ale nie ma gwarancji że wynik będzie zawsze w prawidłowej kolejności:

SELECT Val2,
  c1, c2, c3, c4, c5, c6, c7, c8, c9, c10
FROM
(
  SELECT Val1, Val2,
    'C'+ cast(row_number() over(partition by Val2 
                                order by (select 1)) as varchar(10)) col
  FROM TEMP1
) src
PIVOT
(
  MAX(Val1)
  FOR col IN (C1, C2, C3, C4, C5, C6, C7, C8, C9, C10)
) piv;

Zobacz Skrzypce SQL z wersją demonstracyjną . Używając order by (select 1) zmienia kolejność danych, ale nie gwarantuje, że zawsze będą w tej kolejności. Wynik:

|  VAL2 |  C1 |     C2 |     C3 |     C4 |     C5 |     C6 |     C7 |     C8 |     C9 |    C10 |
------------------------------------------------------------------------------------------------
| 00731 | S01 |    S02 |    S03 |    S04 |    S05 |    S06 |    S07 |    S08 |    S09 |    S07 |
| 00741 | S04 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00746 | S01 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00770 | S01 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00771 | S01 |    S02 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd zwracania CTE

  2. Zaktualizowałem sterownik ODBC programu SQL Server i negatywnie wpłynęło to na wydajność. Co mogę zrobić?

  3. T-SQL uzyskuje węzeł główny w hierarchii

  4. Dowiedz się, na jakim systemie operacyjnym działa program SQL Server (przykład T-SQL)

  5. System.Data.SqlTypes.SqlTypeException:przepełnienie SqlDateTime