2009-08-25 6 views
1

Ma table SQL a trois colonnes:requêtes SQL - Création d'une grille de trois colonnes

 
TaskID VarID Hours 
001  001  10 
001  002  40 
001  003  100 
002  001  50 
002  002  80 
002  003  90 

Je veux produire une sortie comme le

suivant
 
TaskID  VarID -> 001  002  003 
001     10  40  100 
002     50  80  90 

Je pense qu'il ya une requête ou une fonction peut m'aider à faire cela. Des idées?

Répondre

1

Oui, vous pouvez le faire assez facilement dans SQL Server 2005 et plus - le mot magique est PIVOT.

est ici la requête dont vous avez besoin:

SELECT 
     TaskID, 
     [001], [002], [003] 
FROM 
    YourTable 
PIVOT 
    ( 
     SUM(HOURS) 
     FOR VarID IN ([001], [002], [003]) 
    ) 
    AS YourPivot 
ORDER BY 
     YourPivot.TaskID 

L'idée d'un tableau croisé dynamique est un peu difficile à assimilez tout d'abord - peut-être ces sources d'information aideront:

L'explication de MSDN pourrait faire la lumière:

Vous pouvez utiliser le PIVOT et UNPIVOT opérateurs relationnels pour changer une expression d'une valeur de table dans une autre table . PIVOT fait tourner une expression valeur table en faisant tourner les valeurs uniques à partir d'une colonne dans l'expression en plusieurs colonnes dans la sortie, et effectue des agrégations où ils sont nécessaires sur toute les valeurs des colonnes restantes qui sont souhaitée en finale sortie. UNPIVOT effectue l'opération opposée à PIVOT en faisant tourner des colonnes d'une expression de table dans la colonne .

Vous prenez donc essentiellement une VarID variable et tourner ses valeurs distinctes (001, 002, 003) et un agrégat par rapport à ceux (SUM (heures)) dans les colonnes d'une nouvelle table "pivot".

Marc

0

Vous avez besoin d'une requête de tableau croisé. Malheureusement, ce n'est pas facile à faire dans SQL Server. C'est très facile dans MS Access (il y a un assistant pour aider.)

Vous aurez besoin de la fonction PIVOT. J'utilise un proc stocké comme ceci:

CREATE PROCEDURE [dbo].[usp_pivot_sa_byHomeCare] AS 
    DECLARE @columns VARCHAR(1000) 

    SELECT @columns = COALESCE(@columns + ',[' + cast(HomeCareRating as varchar) + ']', 
    '[' + cast(HomeCareRating as varchar)+ ']') 
    FROM vw_sa_byHomeCare 
    GROUP BY HomeCareRating 
    --print @columns 

    DECLARE @query VARCHAR(8000) 

    SET @query = ' 
    SELECT * 
    FROM vw_sa_byHomeCare 
    PIVOT 
    (
    sum(count_pmin) 
    FOR [HomeCareRating] 
    IN (' + @columns + ') 
    ) 
    AS p' 

    --print @query 

    EXECUTE(@query) 

où mon point de vue (vw_sa_byHomeCare) est le point de vue que je veux faire pivoter, HomeCareRating est la colonne de pivoter sur, et somme (count_pmin) est ma valeur.