2010-06-28 1 views
1

Je souhaite créer une table à une ligne avec autant de colonnes que de lignes dans une table renvoyée par une requête SELECT ., où les colonnes créées ont des noms qui sont des valeurs tirées d'une colonne de la requête SELECT et ont des valeurs qui sont des valeurs provenant d'une autre colonne de la requête SELECT.Créer une table à une ligne avec autant de colonnes que de lignes dans une table renvoyée par une requête SELECT

par exemple.

Si j'ai un T1 de table avec deux colonnes comme suit:

Field Value 
    A  1 
    B  2 
    C  3 
    D  4 

Je veux une requête qui renverra une table T2 de ligne comme résultat suivant:

COLUMN NAMES : A  B  C  D 
COLUMN VALUES: 1  2  3  4 
+0

Si vous publiez le code ou XML ou des tables à structure fixe, ** ** S'il vous plaît mettre en évidence les lignes dans l'éditeur de texte et cliquez sur le bouton "code" (101 010) sur la barre d'outils de l'éditeur pour bien mettre en forme et la syntaxe le mettre en évidence!   et ainsi de suite nécessaire .... –

+1

@marc_s Je pensais que, ces deux blocs n'étaient pas un code dans un sens réel et ne seraient pas formatés !! Merci pour l'info. – teenup

Répondre

1

Une simple requête pour résoudre ceci:

SELECT SUM(CASE C1 WHEN 'A' THEN C2 ELSE 0 END) AS 'A', 
     SUM(CASE C1 WHEN 'B' THEN C2 ELSE 0 END) AS 'B', 
     SUM(CASE C1 WHEN 'C' THEN C2 ELSE 0 END) AS 'C', 
     SUM(CASE C1 WHEN 'D' THEN C2 ELSE 0 END) AS 'D' 
FROM T1 

Une requête organique:

DECLARE @C1 CHAR(1), @SQL VARCHAR(500) 
DECLARE array CURSOR 
    FOR SELECT C1 
     FROM T1 
     ORDER BY C1 

OPEN array 

FETCH NEXT FROM array 
INTO @C1; 
SET @SQL = 'SELECT SUM(CASE C1 WHEN ''' + @C1 + ''' THEN C2 ELSE 0 END) AS ''' + @C1 + '''' 
FETCH NEXT FROM array 
INTO @C1; 
WHILE (@@FETCH_STATUS = 0) 
    BEGIN 
     SET @SQL = @SQL + ', SUM(CASE C1 WHEN ''' + @C1 + ''' THEN C2 ELSE 0 END) AS ''' + @C1 + '''' 
     FETCH NEXT FROM array 
     INTO @C1 
    END 
SET @SQL = @SQL + 'FROM T1' 

CLOSE array 
DEALLOCATE array 

EXEC(@SQL) 
0

Ce n'est pas une solution très soignée, mais cela vous donnera une idée de la façon dont vous pouvez y parvenir en utilisant le SQL dynamique.

--** Set up a table to test this with 
DECLARE @TestTable TABLE (Field VARCHAR(20), VALUE INT); 

INSERT INTO @TestTable (Field, VALUE) 
SELECT 'A',1 UNION 
SELECT 'B',2 UNION 
SELECT 'C',3 UNION 
SELECT 'D',4 


--** Set up variables 
DECLARE @ColCount INT; 
DECLARE @Loop INT; 
DECLARE @ColName VARCHAR(20); 
DECLARE @Value INT; 
DECLARE @SQL VARCHAR(255); 

--** Create temp table to hold the results and insert the row for populating 
CREATE TABLE #ResultSet (dummy INT); 
INSERT INTO #ResultSet (dummy) VALUES (0); 

--** Get count of required columns 
SELECT @ColCount = COUNT(*) 
FROM @TestTable AS tt 

SET @Loop = 1 

WHILE @Loop <= @ColCount BEGIN 
    --** Get column name and value 
    WITH Cols AS 
    (
     SELECT tt.Field 
      , tt.VALUE 
      , ROW_NUMBER() OVER (ORDER BY tt.Field) AS row 
     FROM @TestTable AS tt 
    ) 
    SELECT @ColName = Field 
     , @Value = Value 
    FROM Cols 
    WHERE row = @Loop; 

    --** Add the column 
    SET @SQL = 'ALTER TABLE #ResultSet ADD ' + @ColName + ' INT;'; 
    EXEC(@SQL); 

    --** Insert the value 
    SET @SQL = 'UPDATE #ResultSet SET ' + @ColName + ' = ' + CONVERT(VARCHAR(50),@Value) 
    EXEC(@SQL); 

    SET @Loop = @Loop + 1; 
END 

--** Drop the dummy column 
ALTER TABLE #ResultSet DROP COLUMN [dummy]; 

SELECT * 
FROM #ResultSet; 

DROP TABLE #ResultSet; 
+0

Ce code est incorrect. C'est jeter des erreurs. – teenup

+0

J'ai testé cela en utilisant SQL Server 2005 Express et SQL Server 2008 et je ne reçois aucune erreur. Quelles erreurs obtenez-vous? – JonPayne

+0

Désolé, j'utilise Sql Server 2000. – teenup

Questions connexes