SQL Server - отображение объединенных строк в виде столбцов - PullRequest
1 голос
/ 28 апреля 2011

У меня есть две таблицы, определенные следующим образом:

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

Теперь я могу выполнить объединение, чтобы получить количество часов для каждого человека, например:

   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'

Что даст мне набор результатов со следующими столбцами (и между диапазонами дат):

ID, Name, Date, Hours

Я хотел бы изменить выходные столбцы, чтобы они выглядели как электронная таблица:

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

и соответствующие столбцы с правильными значениями часов.

Возможно ли это?

1 Ответ

2 голосов
/ 28 апреля 2011

Ну, для этого вам нужно будет использовать динамический sql, если вы хотите изменить диапазон дат. Итак, во-первых, посмотрите на эту ссылку . Тогда вы можете попробовать следующее:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...