2012-07-17 87 views
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 

回答

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; 

...但是你要努力包括任何边缘案件或无关的信息不这么更好地工作,为四行你提供了。

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 

您可以通过添加之前选择“为创建视图”使这个观点。

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