我在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
答案 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
您可以通过在选择之前添加“创建视图”来使其成为视图。
此公式假设数据与您在问题中指定的数据完全相同。每天只有一行。