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

特定の「名前」のデータを今日の値と昨日の値の 2 つの列に表示するビューを SQL Server で作成するにはどうすればよいですか? 派生テーブルとユニオンを使用してみましたが、目的の出力が得られませんでしたか? アプローチはどうあるべきか。私が探している出力は次のとおりです。

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

2 に答える 2

1

すべての行に一致するペアがあること、それらが常に正確に 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;

...ただし、提供した 4 つの行ほどうまく機能しない、エッジ ケースや無関係な情報を含めるように努める必要があります。

于 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

選択の前に「create view as」を追加することで、これをビューにすることができます。

この定式化は、データが質問で指定したとおりであることを前提としています。毎日正確に 1 行。

于 2012-07-17T01:13:24.970 に答える