sql-server - 在 PIVOT 查询中转换数据类型时出错

标签 sql-server

我想将以下数据转换为 SQL 中的数据透视表。 (显示相应列“周”和相应行“名称”的“总计”值)并且在运行 sp 时,它会抛出异常:

Error converting data type nvarchar to datetime.

The incorrect value "@Week1" is supplied in the PIVOT operator.

Click here to see data

我的查询是:

[Name] [nvarchar](255) NULL,
[Weeks] [DATETIME] NULL,
[total] [float] NULL

@Week1 = '12/6/2015'
@Week2 = '12/13/2015'
@Week3 = '12/20/2015'
@Week4 = '12/27/2015'

SELECT Name, @Week1 AS Week1, @Week2 AS Week2, @Week3 AS Week3, @Week4 AS Week4
INTO #TempData 
FROM 
(
    SELECT Name, Weeks, total FROM #TempData2
) Data 
PIVOT
(
       SUM([total])
       FOR [Weeks] IN ([@Week1],[@Week2],[@Week3],[@Week4])
) Piv

我为所有列提供了 datetime 数据类型,但它抛出 nvarchar to datetime 错误。我尝试过一些解决方案,但它不起作用。

感谢您的帮助...

最佳答案

在 PIVOT 查询中使用变量作为列占位符不起作用。我可以使用以下 SQL 查询生成您想要的大部分结果:

SELECT
  Name,
  [2015-12-06 00:00:00] AS '12/6/2015',
  [2015-12-13 00:00:00] AS '12/13/2015',
  [2015-12-20 00:00:00] AS '12/20/2015',
  [2015-12-27 00:00:00] AS '12/27/2015'
FROM 
(
    SELECT Name, Weeks, total 
    FROM #TempData
) Data 
PIVOT
(
       SUM([total])
       FOR [Weeks] IN ([2015-12-06 00:00:00], [2015-12-13 00:00:00], [2015-12-20 00:00:00],[2015-12-27 00:00:00])
) Piv

产生如下所示的输出,但您将看到“总计”列不存在。

Query Result

为了添加总计列,您需要创建一个派生表来对总计进行求和,然后连接到该表。像这样的东西:

SELECT T1.*, T2.GrandTotal
FROM
(
    SELECT
      Name,
      [2015-12-06 00:00:00] AS '12/6/2015',
      [2015-12-13 00:00:00] AS '12/13/2015',
      [2015-12-20 00:00:00] AS '12/20/2015',
      [2015-12-27 00:00:00] AS '12/27/2015'
    FROM 
    (
        SELECT Name, Weeks, total FROM #TempData
    ) Data 
    PIVOT
    (
      SUM([total])
      FOR [Weeks] IN
      (
        [2015-12-06 00:00:00], [2015-12-13 00:00:00],
        [2015-12-20 00:00:00], [2015-12-27 00:00:00]
      )
    ) Piv
) T1
JOIN
(
  SELECT Name, SUM(Total) AS GrandTotal
  FROM #TempData
  WHERE Weeks IN 
  (
    '2015-12-06 00:00:00',
    '2015-12-13 00:00:00',
    '2015-12-20 00:00:00',
    '2015-12-27 00:00:00'
  )
  GROUP BY Name
) AS T2 ON T2.Name = T1.Name

结果:

Query with Grand Total column

您可以概括 SQL,这样您就不必多次输入日期。在下面的 SQL 命令中,我假设您需要相邻的几周,如示例数据所示:

DECLARE @StartDate datetime = '2015-12-06 00:00:00';
DECLARE @StartWeek int;
SELECT @StartWeek = DATEPART(WEEK, @StartDate);

SELECT Name, [0], [1], [2], [3]
FROM 
(
  SELECT
    Name,
    DATEPART(WEEK, Weeks) - @StartWeek AS WeekNumber,
    Total 
  FROM #TempData
  WHERE DATEPART(WEEK, Weeks) BETWEEN @StartWeek AND (@StartWeek + 3)
) Data 
PIVOT
(
    SUM([total])
    FOR [WeekNumber] IN ([0], [1], [2], [3])
) Piv

这会产生以下结果。尽管您丢失了作为日期的列标题,但您可以通过更改单个变量来改变日期。

Query result

关于sql-server - 在 PIVOT 查询中转换数据类型时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35843701/

相关文章:

SQL Server,将具有多行html代码的文本解析为表格

sql-server - 如何向 SQL Server 中的大表添加 NOT NULL 列?

c# - 关于分布式 c# 应用程序共享数据库选项的建议

sql - SELECT SQL 变量 - 我应该避免使用这种语法并始终使用 SET 吗?

c# - 使用 SQL-Server 2016 生成 EntityFramework 6 模型非常慢

Sql:选择所有类型的条件都为 true 的位置

python - 在 Ubuntu 16.04 中安装适用于 SQL Server 的 Microsoft ODBC 驱动程序 13

sql-server - 生物识别设备记录

sql-server - 在没有网络连接的情况下在 SQL 数据库之间传输表的最简单方法是什么?

sql - 删除 SQL Server 2005 中的条目 - 将 varchar 值转换为数据类型 int 时转换失败