【问题标题】:SQl cross pivot query errorSQL 交叉透视查询错误
【发布时间】:2013-08-14 20:07:39
【问题描述】:

使用 SQL Server 2008 Management Studio:

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

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() 我只是不明白为什么会抱怨?

【问题讨论】:

  • 检查 #temp 表中 dateregistered 列的值。您收到错误消息是因为一个或多个值无法转换为 smalldatetime。确保这些值的格式为 yyyy-mm-dd hh:mm:ss - 还要确保您没有在 SQL Server 上无效的值,例如“0000-00-00 00:00:00”。
  • 是的,这就是我检查的第一件事似乎一切都很好,我怀疑它可能是在将它们视为 nvarchar 列和 dateregistered 作为日期之前的选择,因此它抛出错误无法转换。也许如果我投到一个nvar?嗯,不确定这很奇怪
  • 啊,现在我明白了 - DATEADD(MONTH,0,Convert(smalldatetime,[dateregistered],120)) 返回 smalldatetime 值,而不是 nvarchar。其实,你需要的只是月份数字,对吧?这意味着您应该只使用 MONTH(Convert(datetime,[dateregistered],120)) 返回一个整数,可以将其与数据透视列列表进行比较。
  • 啊啊啊啊!有效哈哈哈,我以为这是该死的枢轴比较!非常感谢丹,发布一个答案,我不赞成确认!

标签: sql sql-server


【解决方案1】:

使用

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

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

【讨论】:

    猜你喜欢
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 2011-04-03
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多