【问题标题】:Pivot with changing dates随着日期变化的枢轴
【发布时间】:2014-01-15 01:03:22
【问题描述】:

我有一个脚本,其结果集如下所示:

-- #Test (temptable)
Branch_Name   C_Date     Percentage
Branch 1      20140107   90
Branch 1      20140108   82
Branch 2      20140107   85
Branch 2      20140108   86

我想转置这些数据,但是 C_Date 被填充以返回 7 天:

WHERE     (1 = 1) AND
       (tTable.C_Date > CONVERT(VARCHAR(10),GETDATE() -7, 112)) AND
       (tEnter.C_Date < CONVERT(VARCHAR(10),GETDATE() -1, 112)).

我试过了

Select * from #Test
pivot (avg (Percentage) for C_date in ([20140107],[20140108])) as PivotTable

它给了我我想要的数据(见下文),

Branch_Name   20140107   20140108
Branch 1      90         82
Branch 2      85         86

但是如何让枢轴查看由GETDATE 填充的日期?我尝试将GETDATE 命令放在每个 [] 中,但这显然不起作用。 ** 注意,我的示例显示 2 天,但我的查询是 7 天前的,不包括它运行的那一天。

任何帮助表示感谢 - 谢谢!

【问题讨论】:

  • 尝试在你的IN上放置一个子查询
  • @JorgeCampos 那行不通。 SQL Server 要求 PIVOT 内的值是固定的
  • 感谢@bluefeet 的信息!真是一团糟(只是我对此的看法):)

标签: sql-server-2008 date pivot


【解决方案1】:

不要尝试使用日期,而是尝试使用“C_Date 和今天之间的天数”。

那么早(在子查询或 CTE 中)你就这样做了DATEDIFF(day,C_Date,GETDATE()) as NumDays

然后您可以将您的位置过滤为WHERE NumDays between 1 and 7,并将您的支点过滤为:

pivot (avg (Percentage) for NumDays in ([1],[2],[3],[4],[5],[6],[7])) as PivotTable

现在,它可以处理您需要的大部分内容。我们不能做的一件事(在普通 SQL 中)是将这些列名转换回日期 - 因为任何特定的 SQL 查询都必须生成具有固定“形状”的结果集 - 数字,names 列的类型是固定的。

但希望这足以在 SQL 中完成,如果您确实需要转换回日期标题,则可以使用任何消耗此结果集的东西来完成。

【讨论】:

  • +1 这是硬编码日期的绝佳选择。如果日期不断变化,那么他们将不得不使用动态 sql,这绝对是一个更好的解决方案。
猜你喜欢
  • 1970-01-01
  • 2018-08-26
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 2015-02-12
  • 1970-01-01
相关资源
最近更新 更多