-5
votes

Pivot requis pour les données ci-dessous structurées

J'ai des données au format ci-dessous.

id   who   where   when   how
1    A     B       C      D


1 commentaires

Vous pouvez vérifier et accepter ma réponse si cela vous a aidé.


3 Réponses :


0
votes

Utiliser l'agrégation conditionnelle

  select id, 
  max(case when question='who' then answer end) as "who",
  max(case when question='where' then answer end) as "where",
  max(case when question='when' then answer end) as "when",
  max(case when question='how' then answer end) as "how"
   from table_name
  group by id


4 commentaires

J'ai tellement de questions pour un seul identifiant, c'est-à-dire plus de 1000. Comment puis-je obtenir des noms de colonnes de manière dynamique?


Utilisez pour toutes les questions de ce processus ou modifiez votre structure de base de données


@Surajkumar hahah j'ai raté une double qote merci mais pour cela, vous avez donné un vote, je pense que vous supprimez maintenant


@Zaynulabadintuhin a retiré le vote.



0
votes

Vous pouvez essayer ceci à l'aide de la requête de pivot dynamique.

create table #temp (ID int, question varchar(20), answer char(1))
insert into #temp values
(1,    'who',         'A'),
(1,    'where',       'B'),
(1,    'when',        'C'),
(1,    'how',         'D')

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.question) 
            FROM #temp c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT Id, ' + @cols + ' from 
            (
                select Id
                    ,question
                    , answer
                from #temp
           ) x
            pivot 
            (
                 max(answer)
                for question in (' + @cols + ')
            ) p '


execute(@query)


2 commentaires

Bonjour Suraj, cette requête travaille pour cet exemple, mais j'ai de nombreux enregistrements pour une seule pièce d'identité dans ce cas, je reçois ci-dessous une erreur. Le nombre d'éléments de la liste de sélection dépasse le nombre maximum autorisé d'éléments 4096.


Je pense que dans ce cas, vous devez fournir une certaine condition de filtrage pour limiter les enregistrements.



0
votes

Vous pouvez essayer cela.

    DECLARE @column AS VARCHAR(MAX), @query  AS VARCHAR(MAX);

    SET @column = STUFF((SELECT distinct ',' + QUOTENAME(t.question) FROM table t FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'),1,1,'')

    set @query = 'SELECT Id, ' + @column + ' from 
                (
                    select Id, question, answer from table
                ) x
                pivot 
                ( max(answer) for question in (' + @column + ')
                ) p '


    exec (@query) 


0 commentaires