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

Vyberte hodnoty sloupců jako sloupce pomocí PIVOT

Vaše požadavky nejsou zcela jasné, ale vypadá to, že se pokoušíte vytvořit nový sloupec s názvem c a poté row_number() s ním spojené -- c1, c2 c3, etc .

Pokud byste ve svém dílčím dotazu použili následující:

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

Viz SQL Fiddle s ukázkou

Dostanete výsledek:

| 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ž se zdá být výsledkem, že pak chcete PIVOT . Potom byste použili PIVOT k tomu 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;

Viz SQL Fiddle s ukázkou . Váš konečný výsledek je pak:

|  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) |

Poznámka:Moje výsledky se mírně liší od toho, co požadujete jako požadovaný výsledek, protože provádím ORDER BY val1 což způsobí S07 hodnoty, které mají být seskupeny.

V databázi není žádné pořadí dat, pokud si je nevyžádáte, takže neexistuje žádná záruka, že jeden z S07 hodnoty se zobrazí jako C10 . K získání výsledku můžete použít následující, ale neexistuje žádná záruka že výsledek bude vždy ve správném pořadí:

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;

Viz SQL Fiddle s ukázkou . Pomocí order by (select 1) mění pořadí dat, ale nezaručuje, že bude vždy v tomto pořadí. Výsledek je:

|  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. Chyba PostgreSQL:nelze se připojit k databázi template1:nelze se připojit k serveru:Žádný takový soubor nebo adresář

  2. Funkce SUM() na serveru SQL Server

  3. Data řazení SQL od řádku n+1 do n-1

  4. SQL nevloží hodnoty null pomocí BULK INSERT