0

我在 SQL Server Express 中有下表,表示名称、日期(包含今天的日期和昨天的日期)和值

 ID  |  Name  |    Date    |  Value
 1   |  ABC   | 07/03/2012 |   20
 2   |  ABC   | 07/04/2012 |   22
 3   |  XYZ   | 07/03/2012 |   16
 4   |  XYZ   | 07/04/2012 |   18

如何在 SQL Server 中创建一个视图,该视图将在两列中显示特定“名称”的数据作为今天的值和昨天的值?我尝试使用派生表和联合,但没有得到所需的输出?应该是什么方法。我正在寻找的输出如下:

 ID  |  Name  | Today's Value | Yesterday's Value
 1   |  ABC   |     22        |      20
 2   |  XYZ   |     18        |      16
4

2 回答 2

1

我不确定每行都有一对匹配的对是否是巧合,它们总是相隔一天,并且您希望 7 月 4 日以某种方式代表“今天”,或者这是否应该反映最高的一天在表中找到。鉴于有限的信息和示例数据,此视图获得了所需的结果:

CREATE VIEW dbo.view_name
AS
  WITH x AS 
  (
    SELECT ID, Name, [Date], Value,
      rn = ROW_NUMBER() OVER (PARTITION BY Name ORDER BY [Date] DESC)
    FROM dbo.table_name
  )
  SELECT x2.ID, x2.Name, 
    [Today's Value] = x.Value,
    [Yesterday's Value] = x2.Value
  FROM x
  INNER JOIN x AS x2 
  -- not sure what you want if there is no data for "yesterday";
  -- maybe above should be an outer join
  ON x.Name = x2.Name

  -- if there may be gaps between days:
  AND x.rn = x2.rn - 1

  -- if there will always be data for every day: 
  AND x.[Date] = DATEADD(DAY, 1, x2.[Date])

  WHERE x.rn = 1
  ORDER BY x2.ID;

...但是,您应该努力包含与您提供的四行相比效果不佳的任何边缘情况或无关信息。

于 2012-07-17T00:51:20.600 回答
0

您可以通过简单的连接来做到这一点:

select id, name, t.value as todayValue, y.value as yesterdayValue
from (select t.*
      from t
      where t.date = cast(getdate() as date)
     ) t left outer join
     (select t.*
      from t
      where t.date = cast(dateadd(d, -1, getdate()) as date)
     ) y
     on t.name = y.name

您可以通过在选择之前添加“创建视图为”来使其成为视图。

此公式假设数据与您在问题中指定的数据完全相同。每天正好一排。

于 2012-07-17T01:13:24.970 回答