【问题标题】:Convert a paramaterized query into a view in SQL Server将参数化查询转换为 SQL Server 中的视图
【发布时间】:2013-09-03 18:52:35
【问题描述】:

假设我在 SQL Server 中有下表:

Date         ColA         ColB
1/1/2013     Val1A        Val1B
1/1/2013     Val2A        NULL
1/1/2013     Val3A        Val3B
1/2/2013     Val1A        NULL
1/2/2013     Val2A        Val4B

而且,我希望看到 ColB 的每日变化 - 在这种情况下可能如下所示:

Date         ColA         ColB_Today       ColB_Prev_Day
1/2/2013     Val1A        NULL             Val1B
1/2/2013     Val2A        Val4B            NULL
1/2/2013     Val3A        NULL             Val3B

因此,为此我创建了一个相当复杂的查询(将表连接到自身),它有一个输入变量和一个计算变量,如下所示:

DECLARE @Date Date = '1/2/2013', @PrevDay Date;
SET @PrevDay = (Select TOP 1 Date from MyTable where Date < @Date order BY Date desc);

SELECT
  @Date as 'Date',
  T1.ColA,
  T1.ColB as ColB_Today,
  T2.ColB as ColB_Prev_Day
FROM
  (SELECT * FROM MyTable where Date = @Date) T1,
 FULL OUTER JOIN
  (SELECT * FROM MyTable where Date = @PrevDay) T2
 ON
  T1.ColA = T2.ColA

这是我要找的。​​p>

现在,我希望能够将其转换为视图(不传递任何参数),而不是这个参数化查询。

我希望我想做的事情是有意义的...换句话说,视图将包含 DateColAColB_TodayColB_Prev_Day 列,它只是从中提取数据该表可以创建相同的结果而无需参数化日期(简单地说,基于表中可用的日期) - 我最大的挑战似乎是上面的 Val3A 行,它的值仅适用于 2 个日期之一,而不是两者都...

有什么想法吗???

谢谢!!

【问题讨论】:

  • 您使用什么版本的 SQL Server?
  • 首先,请停止使用 1/2/2013 这样的模棱两可的格式。是1月2日还是2月1日?不要让我们、代码的其他维护者或 SQL Server 猜测。使用明确的格式,例如YYYYMMDD
  • 您会选择表格中的哪个日期来替换输入参数?
  • 如果这是 SQL Server 2012,您可以使用 LAG 删除连接。
  • 我正在使用 SQL Server 2008 和 @AaronBertrand,这不是我的表中的内容...这正是我用来编写示例的内容...我的表有很大的不同,而且要复杂得多。 ..这只是我的版本,以展示我希望以最简单的方式实现的目标....

标签: sql sql-server sql-server-2008 join sql-view


【解决方案1】:

你可以像这样使用丑陋的东西:

with cte_dates as (
    select distinct [Date] from MyTable
), cte_vals as (
    select distinct ColA from MyTable
)
select
    d.[Date],
    v.ColA,
    T1.ColB as ColB_Today,
    T2.ColB as ColB_Prev_Day
from cte_dates as d
    cross join cte_vals as v
    left outer join MyTable as T1 on T1.ColA = v.ColA and T1.[Date] = d.[Date]
    outer apply (
        select top 1 TT.ColB
        from MyTable as TT
        where TT.ColA = v.ColA and TT.[Date] < d.[Date]
        order by TT.[Date] desc
    ) as T2

=> sql fiddle demo

在我进一步了解您的数据之前,很难做得更好。您的表格中的日期之间有间隔吗?

【讨论】:

  • 哇 - 这是一种丑陋的解决方案......但它仍然很酷!要回答您的问题,我的日期之间会有间隔,我总是希望将此日期 1 的数据与之前的最近日期返回,这样如果 2 个日期中的 1 个缺少 ColA,它只会返回NULL 代表ColB 值....我希望这是有道理的,但请提出您可能有的任何其他问题... !!感谢您的回复!!!
  • 在你的数据上试试这个,看看你是否有想要的输出
  • 我想你的意思是D.[Date],你写了C.Date,你也得到all the dates,而不仅仅是最大日期的那些。
  • @ConradFrix 我认为获取所有可能的日期是 OP 问题的预期行为。更新别名,谢谢
  • 也许吧。我不完全确定 OP 的含义是什么我最大的挑战似乎是上面的 Val3A 行,它的值仅适用于两个日期之一,而不是两个日期在任何情况下,如果你想匹配所需的输出它是easy enough to fix
猜你喜欢
  • 1970-01-01
  • 2015-11-29
  • 2016-07-29
  • 2020-03-06
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多