SQL Server - Відображення об'єднаних рядків як стовпців - sql, sql-server, tsql, sql-server-2008, pivot

У мене дві таблиці визначені наступним чином:

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

і відповідні стовпці з правильними значеннями години.

Чи це можливо?

Відповіді:

2 для відповіді № 1

Ну, вам потрібно буде використовувати динамічний 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, "[email protected]+"
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 ("[email protected]+")) AS PT"

EXEC sp_executesql @Query

Схожі запитання
Найбільш популярний