7
votes

Utilisation de pivot dans SQL Server 2008

Disons que j'ai des données, que ce soit dans une table SQL Server 2008 ou une variable [Table] -Typed: xxx pré>

Je souhaite récupérer les données comme un ensemble de résultats qui ressemble Ceci: P>

author_id     review_id     1     2     3     4     5
88540         99001         719   720   721   722   723
36414         24336         302   303   304   305   306


0 commentaires

5 Réponses :


0
votes
select * 
from @t pivot
(
    max(answer_id) for question_id in ([1],[2],[3],[4],[5])
) pivotT
The only way to vary the list ([1],[2],[3],[4],[5]) would be to build this query in a string (dynamically) and then execute it.

0 commentaires

9
votes

En fait, vous feriez mieux de faire cela dans le client. Supposons que vous utilisiez des services de rapport, obtenez les données conformément à votre premier ensemble de résultats et l'affiche à l'aide d'une matrice, avec Author_ID et Review_ID dans le groupe de lignes, question_Id dans le groupe de colonnes et max (réponse_id) au milieu.

Une requête est faisable, mais vous auriez besoin de SQL dynamique en ce moment.

... quelque chose comme: xxx


3 commentaires

Cela semble être ce dont j'ai besoin. Je vais lui donner un coup et faire un coup de retour - merci!


S'il vous plaît garder à l'esprit la sous-requête. Si vous utilisez simplement "Select * à partir de votretable", toutes les autres colonnes impliquées affecteront le regroupement implicite que la fonction pivot fournit. Et si vous avez des erreurs, commencez la ligne EXEC , le remplaçant par Sélectionnez @qry


Je n'utilise jamais [SELECT *]] plus - J'adore toujours explicitement les colonnes que j'accède - afin que ce ne soit pas un problème. Et oui, j'utilisais [Sélectionnez @qry] pendant un moment afin que je puisse voir / déboguer la déclaration SQL générale avant de courir. Votre code a travaillé comme promis - merci beaucoup pour votre aide!




0
votes

voir Cette réponse

Fondamentalement, vous pré-inspecter les données pour obtenir les colonnes, puis générer dynamiquement le SQL à l'aide de la liste de pivotements dynamique. Il n'y a vraiment pas de manière non dynamique, car la définition des colonnes de l'ensemble que vous souhaitez revenir n'est pas corrigée.


0 commentaires

2
votes
SELECT author_id, review_id, [1], [2], [3], [4], [5]
FROM 
    (
        SELECT author_id, review_id, question_id, answer_id
        FROM the_table
    ) up
PIVOT (MAX(answer_id) FOR

0 commentaires