显示昨天和今天同一行的数据

时间:2012-07-17 00:38:57

标签: sql sql-server tsql

我在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

2 个答案:

答案 0 :(得分: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;

...但是你应该努力包括任何边缘情况或无关信息,这些信息与你提供的四行不太一样。

答案 1 :(得分: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

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

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