3

現在、SSIS を使用してデータベースにクエリを実行し、毎晩同じクエリのレコードを日付スタンプ付きの別のデータベースのテーブルに返します。SSRS / SQL クエリを使用して、昨日のレコードと今日のクエリから返されたレコードを比較し、一致しないものを返すことができるようにしたいと考えています。

これには以下が含まれます。

  • 新規追加(新規行)
  • 新しい削除 (昨日存在し、今日は存在しない行)
  • 昨日と今日の間に変更された可能性のある列

テーブル内のデータの例は次のとおりです。

SERVERNAME    CPUs    RAM    DISK    DATE  
==========    ====    ===    ====    ====  
Server1        1       2      20     8/8/2013  
Server2        2       4      40     8/8/2013  
Server3        2       4      40     8/8/2013  
Server1        1       2      20     9/8/2013  
Server3        2       6      40     9/8/2013  

違いを比較するクエリが返されます(または同様のもの)-追加/削除/変更に対応するために3つのテーブルを返すことさえ気にしません:

SERVERNAME    CPUs    RAM    DISK    DATE  
==========    ====    ===    ====    ====  
Server2        2       4      40     8/8/2013  
NULL           NULL    NULL   NULL   9/8/2013  
Server3        2       4      40     8/8/2013  
Server3        2       6      40     9/8/2013  

どんな援助でも大歓迎です!

初めての投稿なので文章が乱れていたらすみません…

4

2 に答える 2

1

日付ごとにサーバー名が重複しないと仮定すると、次のことを試すことができます。

WITH allservers AS (
  SELECT DISTINCT SERVERNAME AS GroupingName
  FROM YourTable
  WHERE DATE IN (@yesterday, @today)
)
SELECT s.GroupingName, x.*
FROM allservers AS s
LEFT JOIN YourTable AS y ON s.GroupingName = y.SERVERNAME AND y.DATE = @yesterday
LEFT JOIN YourTable AS t ON s.GroupingName = t.SERVERNAME AND t.DATE = @today
CROSS APPLY (
  SELECT @yesterday AS GroupingDate, y.*
  UNION ALL
  SELECT @today     AS GroupingDate, t.*
) x
WHERE EXISTS (
  SELECT y.CPUs, y.RAM, y.DISK
  EXCEPT
  SELECT t.CPUs, t.RAM, t.DISK
)
ORDER BY s.GroupingName, x.GroupingDate;

このクエリによって生成された出力は、正確には一致しませんが、メインの SELECT 句で簡単に調整できます。追加された 2 つの列 と の主な目的は、GroupingName関連GroupingDateする行をまとめて特定の順序 (昨日の行の後に今日の行) を維持することです。

SQL Fiddle でクエリのライブ デモを試すことができます。

于 2013-08-08T18:56:31.063 に答える
0

EXCEPT および INTERSECT t-sql コマンドを使用して、行セット間の違いを見つけることができます

これを使用する例を次に示します。

declare @foo as table (foo int)
declare @foo2 as table (foo int)

insert into @foo values(1),(2),(5)
insert into @foo2 values(1),(2),(4)

select * from @foo
union
select * from @foo2
except
select * from @foo
intersect
select * from @foo2

このクエリは、2 番目のテーブルに存在しない最初のテーブルのすべてのレコードと、2 番目のテーブルに存在するが最初のテーブルには存在しないすべてのレコードを検索します ("NOT INTERSECT" のように機能します)。

于 2013-08-08T10:23:58.033 に答える