2 votes

Transformer une table SQL

Nous avons un tableau qui a le format suivant

RecordID FieldName FieldValue

1         Name      John
1         Age       30
2         Name      Alice
2         Age       40

Nous aimerions présenter cela comme :

John   30
Alice  40

Quelqu'un a-t-il une bonne solution pour cela ?

3voto

Marek Grzenkowicz Points 9652
SELECT
  TN.FieldValue AS ValueName
, TV.FieldValue AS ValueAge
FROM dbo.Table1 TN
INNER JOIN dbo.Table1 TV ON TN.RecordID = TV.RecordID
  AND TN.FieldName = 'Name'
  AND TV.FieldName = 'Age'

1voto

Manfred Sorg Points 840

Pourquoi personne n'a utilisé le pivot ?

declare @a TABLE(RecordId int, FieldName varchar(20), FieldValue varchar(20)) 

insert into @a select 1, 'Name', 'John' 
insert into @a select 1, 'Age', '30' 
insert into @a select 2, 'Name', 'Alice' 
insert into @a select 2, 'Age', '40' 

select *
from @a a pivot (max(FieldValue) for FieldName in (Name,Age)) p

0voto

Ralf de Kleine Points 5476
declare @a TABLE(RecordId int, FieldName varchar(20), FieldValue varchar(20))

insert into @a select 1, 'Name', 'John'
insert into @a select 1, 'Age', '30'
insert into @a select 2, 'Name', 'Alice'
insert into @a select 2, 'Age', '40'

select 
 records.RecordId 
 , name.fieldvalue [Name]
 , age.fieldvalue [Age]
from
 (select distinct recordid from @a) records
 inner join @a name on records.recordid = name.recordid and name.fieldname = 'Name'
 inner join @a age on records.recordid = age.recordid and age.fieldname = 'Age'

0voto

james-geldart Points 151

Ce n'est pas très joli (mais les données ne le sont pas non plus), mais cela fonctionnera si les noms de vos colonnes sont connus lorsque vous écrivez la requête :

SELECT 
RecordId, 
group_concat( if( FieldName = 'name', FieldValue, '' ) SEPARATOR '' ) AS person_name, 
group_concat( if( FieldName = 'age', FieldValue, '' ) SEPARATOR '' ) AS person_age
FROM test_table
GROUP BY RecordId

(fonctionne dans MySQL 5.0)

Vous devez également utiliser CAST pour que les champs soient du bon type.

Si vous ne connaissez pas les champs, vous devrez (par programmation) effectuer une sélection distincte de NomChamps au préalable afin de construire votre requête.

J'ai l'impression que le kit de création de contenu (CCK) de Drupal fait quelque chose de similaire à ceci

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X