0

使用 SQL Server 2008 管理工作室:

我目前正在创建以下交叉表查询,这就是我目前所拥有的。

CREATE TABLE #Months
(UserID int,
ModuleID int,
Passed bit,
Name nvarchar(255),
Company nvarchar(50),
LanguageID nvarchar(10),
CodeRegisteredWith nvarchar(50),
TotalLoggedInDuration int,
Region int,
IsAdmin bit,
IsRep bit,
IsRetailer bit,
IsTeamLeader bit,
dateregistered date,
total int,
usertotal int,
complete int,
January int, february int, march int, april int, may int, June int, July int,
August int, September int, October int, November int, December int)

SELECT
   [1] January,
   [2] February,
   [3] March,
   [4] April,
   [5] May,
   [6] June,
   [7] July,
   [8] August,
   [9] September,
   [10] October,
   [11] November,
   [12] December
   FROM
(
  SELECT DATEADD(MONTH,0,Convert(smalldatetime,[dateregistered],120))as months
  FROM #Temp WITH(NOLOCK)
) d
pivot 
(
   SUM(complete)
   for months in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])
) p 

此查询旨在用“通过”数据填充 12 个新字段(月):

因此,理论上您有 12 列一条记录,每个单元格将包含该月通过的用户数量的总和。

但我目前正在添加和测试,因为这是使用虚拟表的大型存储过程的一部分。当我运行此程序时,所有其他程序都可以工作,但这失败并抱怨:

消息 8114,级别 16,状态 1,过程 GRAPHMainQuery,第 127 行将
数据类型 nvarchar 转换为 smalldatetime 时出错。
消息 473,级别 16,状态 1,过程 GRAPHMainQuery,第 127 行
PIVOT 运算符中提供了不正确的值“1”。

Nvarchar 到 smalldatetime?我已经将它作为日期存储在我的#table 中,我什至在使用 convert() 我只是不明白为什么会抱怨?

4

1 回答 1

1

采用

MONTH(Convert(datetime,[dateregistered],120)) as months

获取月份数(返回一个整数)。DATEADD(...) 返回一个 datetime/smalldatetime 值,不能与 [1]...[12] 进行比较 PIVOT 语句中的月份数列。

于 2013-08-14T11:40:38.413 回答