2012-04-21 3 views
2

Comment transformer cette:requête SQL pour afficher les résultats verticalement

ID Name Description 
1 Test1a TestDesc1a 
1 Test1b TestDesc1b 
2 Test2a TestDesc2a 
2 Test2b TestDesc2b 

dans ce:

ID Column   1   2 
1 Name   test1a  test1b 
1 Description testDesc1a testDesc1b 
+3

Pourquoi avez-vous besoin faire cela en SQL? Comment utilisez-vous ces données une fois que vous l'avez sorti de la base de données? Il pourrait être plus facile d'effectuer cette transformation du côté client. – Tony

Répondre

0

Vous devez utiliser une requête PIVOT.

Une discussion de base des requêtes PIVOT peut être trouvée sur [MSDN] [1].

0

Cette question est délicate à résoudre, mais la sortie spécifiée n'est pas appropriée/conflictuelle. Voici une solution similaire que vous pouvez essayer

création de la table Exemple:

CREATE TABLE [dbo].[TestTable](
[Id] [int] NULL, 
[Name] [nvarchar](50) NULL, 
[Description] [nvarchar](50) NULL) 

Insertion des valeurs d'échantillon:

INSERT INTO TestTable VALUES (1,'Test1a','TestDesc1a') 
INSERT INTO TestTable VALUES (2,'Test1b','TestDesc1b') 
INSERT INTO TestTable VALUES (3,'Test2a','TestDesc2a') 
INSERT INTO TestTable VALUES (4,'Test2b','TestDesc2b') 

requête pour obtenir la sortie désirée à l'aide Pivot:

SELECT 'Name' AS [Column], [1], [2],[3],[4] 
FROM 
(SELECT Name, id from TestTable) AS ST 
PIVOT 
(Max(Name) FOR ID IN ([1], [2],[3],[4])) AS PT 

UNION 

SELECT 'Description' AS [Column], [1], [2],[3],[4] 
FROM 
(SELECT id,[Description] from TestTable) AS ST 
PIVOT 
(Max([Description]) FOR ID IN ([1], [2],[3],[4])) AS PT 
ORDER BY [Column] DESC 

OutPut:

Column   1   2   3   4 
Name   Test1a  Test1b  Test2a  Test2b 
Description TestDesc1a TestDesc1b TestDesc2a TestDesc2b 

Hope this aide à résoudre votre question.

0

Vous pouvez utiliser un PIVOT statique si vous ne disposez que de quelques colonnes, mais je suppose que vous aurez plus de 2 ID, donc vous voudrez probablement utiliser un Dynamic PIVOT pour cette requête. L'utilisation d'un pivot dynamique vous permettra d'avoir plus que les deux ids que vous avez fournis, il va récupérer tous les Ids de la table puis PIVOT:

create table temp 
(
    id int, 
    name varchar(10), 
    description varchar(20) 
) 

insert into temp values (1, 'Test1a', 'TestDesc1a') 
insert into temp values (1, 'Test1b', 'TestDesc1b') 
insert into temp values (2, 'Test2a', 'TestDesc2a') 
insert into temp values (2, 'Test2b', 'TestDesc2b') 


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

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

set @query = 'SELECT ''Name'' as [Column], ' + @cols + ' from 
      (
       select id 
        , name 
       from temp 
      ) x 
      pivot 
      (
       max(name) 
       for id in (' + @cols + ') 
      ) p 
      UNION 
      SELECT ''Description'' as [Column], ' + @cols + ' from 
      (
       select id 
        , description 
       from temp 
      ) x 
      pivot 
      (
       max(description) 
       for id in (' + @cols + ') 
      ) p ' 


execute(@query) 

drop table temp 

Résultats:

Column   1    2 
Description  TestDesc1b TestDesc2b 
Name   Test1b  Test2b 
Questions connexes