sql >> Database >  >> RDS >> Sqlserver

Selecteer kolomwaarden als kolommen met PIVOT

Uw vereisten zijn niet helemaal duidelijk, maar het lijkt erop dat u een nieuwe kolom probeert te maken met de naam c met dan een row_number() ermee verbonden -- c1, c2 c3, etc .

Als u het volgende in uw subquery zou gebruiken:

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

Zie SQL Fiddle met demo

Je zou het resultaat krijgen:

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

Wat het resultaat lijkt te zijn dat u vervolgens wilt PIVOT . U zou dan de PIVOT . toepassen hiertoe met:

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;

Zie SQL Fiddle met demo . Uw eindresultaat is dan:

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

Let op:mijn resultaten zijn iets anders dan wat u vraagt ​​als het gewenste resultaat omdat ik een ORDER BY val1 uitvoer waardoor de S07 waarden die moeten worden gegroepeerd.

Er is geen volgorde van gegevens in een database tenzij u er een aanvraagt, dus er is geen garantie dat een van de S07 waarden verschijnen als C10 . U kunt het volgende gebruiken om het resultaat te krijgen, maar er is geen garantie dat het resultaat altijd in de juiste volgorde staat:

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;

Zie SQL Fiddle met demo . Met behulp van de order by (select 1) de volgorde van de gegevens verandert, maar het garandeert niet dat het altijd in die volgorde zal zijn. Het resultaat is:

|  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. Een database verbinden met een Amazon VPC

  2. Waarom voegt SQL Server een geheel getal van 4 bytes toe aan niet-unieke geclusterde indexen?

  3. Spring Boot + docker-compose + MySQL:verbinding geweigerd

  4. Fout tijdens het verzenden van QUERY-pakket