【问题标题】:SQL Server - Displaying joined rows as columnsSQL Server - 将连接的行显示为列
【发布时间】:2011-04-28 02:07:21
【问题描述】:

我有两个表定义如下:

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

以及具有正确小时值的相应列。

这可能吗?

【问题讨论】:

  • 简短的回答是,如果不使用动态 SQL,您将无法在 T-SQL 中执行此操作,这暗示着根本不应该在 T-SQL 中执行此操作。相反,您应该在中间层或报告引擎中的 T-SQL 之外构建查询。

标签: sql sql-server tsql sql-server-2008 pivot


【解决方案1】:

好吧,如果您想更改日期范围,您将需要为此使用动态 sql。所以首先,看看this link。然后您可以尝试以下方法:

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

【讨论】:

    猜你喜欢
    • 2013-04-03
    • 2019-10-16
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    相关资源
    最近更新 更多