Afficher les lignes en tant que colonnes

Voici ma table SQL:

Table1 Col1 Col2 a 1 a 2 a 3 b 1 c 1 c 2 

Comment puis-je interroger cette table pour l'afficher comme ceci?

 col1,value1,value2,value3 a,1,2,3 b,1,null,null c,1,2,null 

Chaque valeur de col1 n'aura jamais plus de 5 loggings. Je ne sais pas quelles valeurs sont dans col2, elles seront dynamics.

Si vous utilisez SQL 2005 ou plus tard, PIVOT est une bonne option. Pour les requêtes statiques, vous pouvez supposer que le nombre maximum de valeurs est 1, 2, 3 … et utiliser PIVOT comme ceci:

 SELECT Col1 AS 'Col1', [1], [2], [3], [4], [5] FROM (SELECT Col1, Col2 FROM dbo.Table1) AS SourceTable PIVOT ( MAX(Col2) FOR Col2 IN ([1], [2], [3], [4], [5]) ) AS PivotTable; 

Si vous acceptez le SQL dynamic, vous pouvez créer l'instruction SQL et l'exécuter à l'aide de sp_executesql :

 DECLARE @Values VARCHAR(1000) DECLARE @SQL NVARCHAR(MAX) SET @Values = NULL SELECT @Values = COALESCE(@Values + ', ', '') + + '[' + CAST(Col2 AS VARCHAR) + ']' FROM (SELECT DISTINCT TOP 100 PERCENT Col2 FROM dbo.Table1 ORDER BY 1) T SET @SQL = ' SELECT Col1 AS ''Col1'', ' + @Values + ' FROM (SELECT Col1, Col2 FROM dbo.Table1) AS SourceTable PIVOT ( MAX(Col2) FOR Col2 IN (' + @Values + ') ) AS PivotTable; ' EXECUTE sp_executesql @SQL 

Les bases de données ne sont pas très efficaces pour faire ce que vous requestz. Même si je suis sûr que c'est possible et que quelqu'un publiera la solution ici, peut-être que vous pourriez vous rendre la vie plus facile avec un petit script bash.

Ce code obtient une list de toutes les valeurs uniques dans la colonne 1. Il interroge ensuite la table pour toutes les valeurs de la colonne 2 pour la valeur donnée dans la colonne 1. La command "tr" remplace les caractères de nouvelle ligne par commmas et la command sed bascule la dernière virgule en caractère de nouvelle ligne.

J'ai l'printing que si vous avez posté plus sur votre problème particulier, qu'il pourrait y avoir une meilleure solution pour votre problème. Toute solution qui est une pure requête va impliquer de relier la table à elle-même 5 fois, ce qui pourrait nécessiter beaucoup de traitement en fonction de la taille de votre table.

Note: J'ai fait quelques suppositions puisque la question n'avait pas les détails. J'ai supposé que nous utilisons postgresql et que la database est appelée test.

 #!/bin/bash echo "select distinct col1 from table1 order by col1" | psql -At test | while read col1;do echo -n "$col1," echo "select col2 from table1 where col1='$col1' order by col2" | psql -At test | tr '\n' ',' | sed s/,$/\n/' done 

La sortie est alors:

 a,1,2,3 b,1 c,1,2