sql >> Database >  >> RDS >> Sqlserver

Kan de draaitabel niet draaien met mijn query?

Om de andere antwoorden uit te breiden, vereist de PIVOT-functie een soort aggregatie. Aangezien de waarde die u van een rij naar een kolom wilt converteren een tekenreeks is, bent u beperkt tot het gebruik van de max() of min() geaggregeerde functie.

Terwijl @Muhammed Ali's antwoord werkt als je een enkele AttributeName . hebt /AttributeValue paar, als je meerdere paren hebt voor elke ID , dan retourneert u alleen de max of min waarde.

Als uw voorbeeldgegevens bijvoorbeeld zijn:

INSERT INTO @MyTable VALUES ('A1', 'Atr1', 'A1V1');
INSERT INTO @MyTable VALUES ('A1', 'Atr1', 'A1V4');
INSERT INTO @MyTable VALUES ('A1', 'Atr2', 'A1V2');
INSERT INTO @MyTable VALUES ('A1', 'Atr3', 'A1V3');
INSERT INTO @MyTable VALUES ('A2', 'Atr1', 'A2V1');
INSERT INTO @MyTable VALUES ('A2', 'Atr2', 'A2V2');
INSERT INTO @MyTable VALUES ('A2', 'Atr3', 'A3V3');

Ook al heb je meerdere rijen voor de combinatie van A1 en Atr1 , de andere zoekopdrachten retourneren alleen de max(attributevalue) :

| ID | ATR1 | ATR2 | ATR3 |
|----|------|------|------|
| A1 | A1V4 | A1V2 | A1V3 |
| A2 | A2V1 | A2V2 | A3V3 |

Ik vermoed dat je eigenlijk alle combinaties zou willen retourneren. Ik stel voor om uw zoekopdracht uit te breiden met de vensterfunctie, row_number() in uw vraag. Deze query genereert een unieke waarde die vervolgens wordt opgenomen in het groeperingsaspect van de PIVOT en waarmee u meer dan één rij voor elke ID kunt retourneren.

Door het toevoegen van de row_number() , zal de zoekopdracht er als volgt uitzien:

SELECT Id, [Atr1], [Atr2],[Atr3]
FROM
( 
  SELECT ID, AttributeName, AttributeValue,
    row_number() over(partition by id, attributename
                      order by attributevalue) seq
  FROM @MyTable
) AS SourceTable 
PIVOT 
(
    max(AttributeValue)
    FOR AttributeName IN ([ATR1], [ATR2], [ATR3])
) AS pvt
order by id;

Zie SQL Fiddle met demo . U krijgt een resultaat dat alle rijen retourneert:

| ID | ATR1 |   ATR2 |   ATR3 |
|----|------|--------|--------|
| A1 | A1V1 |   A1V2 |   A1V3 |
| A1 | A1V4 | (null) | (null) |
| A2 | A2V1 |   A2V2 |   A3V3 |

Als u problemen ondervindt bij het begrijpen van het concept van PIVOT, raad ik u aan een combinatie van een aggregatiefunctie met een CASE-expressie te gebruiken om het resultaat te krijgen. U kunt dan de groepering van de reeks/id zien:

SELECT Id, 
  max(case when attributename = 'Atr1' then attributevalue end) Atr1,
  max(case when attributename = 'Atr2' then attributevalue end) Atr2,
  max(case when attributename = 'Atr3' then attributevalue end) Atr3
FROM
( 
  SELECT ID, AttributeName, AttributeValue,
    row_number() over(partition by id, attributename
                      order by attributevalue) seq
  FROM @MyTable
) AS SourceTable 
group by id, seq

Zie SQL Fiddle met demo



  1. MySql vs NoSql - Gegevensstructuur en implementatie van opmerkingen en meldingen op sociale netwerken

  2. Hoe twitter OAuth-gegevens op te slaan in de mysql-database?

  3. Is het mogelijk om een ​​subquery te doen met Sequelize.js?

  4. Back-up op tabelniveau