2012-07-17 38 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 

您可以通過添加之前選擇「爲創建視圖」使這個觀點。

該公式假定數據與您在問題中指定的數據完全相同。每天只有一行。