我目前正在使用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
非常感谢任何帮助!
这是我的第一篇文章,如果格式化搞砸了就道歉......
答案 0 :(得分: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子句中轻松调整。添加的两列{%1}和GroupingName
的主要目的是将相关行保持在一起并按特定顺序排列(昨天的行后跟今天的行)。
您可以使用查询at SQL Fiddle的实时演示。
答案 1 :(得分:0)
您可以使用EXCEPT and 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
此查询将在第一个表中找到第二个表中不存在的所有记录 以及第二个表中存在但在第一个表中不存在的所有记录 (它的工作方式类似于“NOT INTERSECT”)