SQL Server – Affichage des lignes jointes en tant que colonnes

J'ai deux tables définies comme suit:

User (ID int, name varchar) Hours (UserID int, [date] date, hours float) 

Maintenant, je peux effectuer une jointure pour get le nombre d'heures pour chaque personne comme ça:

  SELECT U.ID, U.Name, H.[date], H.Hours FROM Users U LEFT JOIN Hours H ON U.ID = H.UserID WHERE H.Date > '2011-01-01' AND H.Date < '2011-02-01' 

Ce qui me donnerait un set de résultats avec les colonnes suivantes (et entre la plage de dates):

 ID, Name, Date, Hours 

Ce que je voudrais faire, c'est changer les colonnes de sortie pour qu'elles ressemblent plus à une feuille de calcul:

 ID, Name, 2011-01-01, 2011-01-02, 2011-01-03 ..... 2011-01-31 

et les colonnes correspondantes avec les valeurs d'heure correctes.

Est-ce possible?

Eh bien, vous aurez besoin d'utiliser SQL dynamic pour cela, si vous voulez changer les plages de dates. Alors d'abord, jetez un oeil à ce lien . Ensuite, vous pouvez essayer ce qui suit:

 DECLARE @Dates NVARCHAR(MAX), @Query NVARCHAR(MAX) SET @Dates = '' SELECT @Dates = @Dates + '[' + CONVERT(VARCHAR(10),[date],120) +'],' FROM Hours WHERE [Date] >= @StartDate AND [Date] < @EndDate GROUP BY CONVERT(VARCHAR(10),[date],120) ORDER BY CONVERT(VARCHAR(10),[date],120) SET @Dates = LEFT(@Dates ,LEN(@Dates )-1) SET @Query = ' SELECT ProviderName, '+@Dates+' FROM ( SELECT U.ID, U.Name, H.[date], H.Hours FROM Users U LEFT JOIN Hours H ON U.ID = H.UserID WHERE H.Date >= '''+CONVERT(VARCHAR(8),@StartDate,112)+''' AND H.Date < '''+CONVERT(VARCHAR(8),@EndDate,112)+''') T PIVOT(SUM(Hours) FOR [date] IN ('+@Date+')) AS PT' EXEC sp_executesql @Query