2011-03-09 176 views
0

我有两个表,我需要比较以确保值匹配。就上下文而言,一个是员工的时间表,另一个是持有他们请求的表格。每个人都有一个时间表代码和几个小时。我的计划是通过总结进行比较,看看它们是否匹配。但是,我每次都会遇到问题,使得我的逻辑能够很好地工作。如果没有我发布我的代码(无论如何这个代码很快就会变得混乱),你会如何处理这个问题?比较需要能够以编程方式运行,最后返回true/false。比较两个表中的数据

这可以是RPG解决方案或SQL解决方案。

这是我需要确保是真实的。

Table 1 
02 1.5 
04 16.0 

Table 2 
02 1.5 
04 16.0 

问题是,当

Table 1 
02 1.5 

Table 2 
02 1.5 
04 16.0 

或当

Table 1 
02 1.5 
04 16.0 

Table 2 
02 1.5 

以上,所以当

Table 1 
02 1.5 
04 16.0 

Table 2 
+0

请aleast给我们这两个表和样本数据和预期的结果集的表结构。 – HLGEM 2011-03-09 21:32:04

+0

小时计数需要在每个表中以相同的时间表码匹配的行? – sreimer 2011-03-09 21:34:22

+0

增加了一些错误的例子,我需要确保是真的。 – 2011-03-09 21:42:30

回答

0

我把我的两个SQL结果放到视图中,然后基于很多人的反馈已经想出了这个。我认为这可以创建到它​​自己的存储过程中。

SELECT SUM (ERROR_COUNT) AS TOTAL_ERRORS INTO NUM_ERRORS FROM (
SELECT COUNT (*) AS ERROR_COUNT 
FROM MPRLIB . V_TSHOURSUMM A EXCEPTION JOIN MPRLIB . V_REQHOURSUMM B 
ON A . EM_NUMBER = B . EM_NUMBER AND A . TIMESHEET_CODE = B . TIMESHEET_CODE AND A.HOURS_SUMMARY = B . HOURS_SUMMARY 
WHERE A . EM_NUMBER = EMPLOYEE_ID OR B . EM_NUMBER = EMPLOYEE_ID 
UNION 
SELECT COUNT (*) AS ERROR_COUNT 
FROM MPRLIB . V_REQHOURSUMM A EXCEPTION JOIN MPRLIB . V_TSHOURSUMM B 
ON A . EM_NUMBER = B . EM_NUMBER AND A . TIMESHEET_CODE = B . TIMESHEET_CODE AND A . HOURS_SUMMARY = B . HOURS_SUMMARY 
WHERE A . EM_NUMBER = EMPLOYEE_ID OR B . EM_NUMBER = EMPLOYEE_ID) TABLE 

看来工作,但似乎...过度。思考?有没有更好的办法?

0

在一般情况下,如果合并两个表,伯爵结果表的结果与cou相同nt个人表,你可以说他们有相同的值。

我不知道如何申请你的情况,但也许你可以。

1

这将在比较A和B的总小时数对于每个ID值,并且仅返回记录有B的总和不等于A.它把B的不匹配的值为零。

SELECT A.id, A.hours, SUM(COALESCE(B.Hours,0)) 
FROM A 
LEFT OUTER JOIN B 
    ON B.ID = A.ID 
WHERE 1=1 
    AND A.id = B.id 
GROUP BY A.id 
HAVING A.Hours != SUM(COALESCE(B.Hours,0)) 

Cheers, 
Daniel 
0

最简单的解决方案展线中处于冲突:

CREATE TABLE requests (employees_id integer, hours decimal); 
CREATE TABLE hours (employees_id integer, hours decimal); 

SELECT * FROM requests, hours WHERE requests.employees_id = hours.employees_id AND requests.hours != hours.hours; 

不过,这并不如例如工作一个2h请求需要匹配两个1h标记。

0

我做了这样的事情最近 - 这里有我的笔记......结果集显示了存在于一个表而不是其他值加行的差异。

第1步:创建包含要比较的行的临时表。

步骤2:执行完全OUTER JOIN上使用非聚集体列作为匹配判据的临时表。

DECLARE @Ta TABLE (PubA varchar(255), CampA varchar(255), RevA money) 

INSERT INTO @Ta (PubA, CampA, RevA)      
    SELECT Publisher, [Campaign Name], SUM([Revenue USD])    
    FROM D1.dbo.Stats    
    GROUP BY Publisher, [Campaign Name] 

DECLARE @Tb TABLE (PubB varchar(255), CampB varchar(255), RevB money) 

INSERT INTO @Tb (PubB, CampB, RevB)      
    SELECT Publisher, [Campaign Name], SUM([Revenue USD])    
    FROM D2.dbo.Stats     
    GROUP BY Publisher, [Campaign Name] 

SELECT PubA, CampA, RevA, PubB, CampB, RevB, RevA-RevB DiffRev 
FROM @Ta       
FULL OUTER JOIN @Tb      
ON PubA=PubB and CampA=CampB       
ORDER BY DiffRev DESC      
GO 
1

这应该给请求的结果:

with w1 (wid, sumHrs) 
as (SELECT id, sum(hours) 
     FROM A a1 
     GROUP BY id), 
    w2 (wid, sumHrs) 
as (SELECT id, sum(hours) 
     FROM B b1 
     GROUP BY id) 
select '1', w1.wid from w1 INNER JOIN w2 
           on w1.wid = w2.wid 
         where w1.sumHrs <> w2.sumHrs 
union 
select '2', w1.wid from w1 EXCEPTION JOIN w2 
           on w1.wid = w2.wid 
union 
select '3', w2.wid from w2 EXCEPTION JOIN w1 
           on w2.wid = w1.wid 

有可能是由于从样本调整和简化了需要小细节的变化我有一个很接近,但并不确切。但是,所有的基本概念都应该清楚。

的CTE给出了在充分语句中使用一对夫妇摘要“意见”。 INNER JOIN给出匹配的ID与不匹配的HOURS。第一EXCEPTION JOIN提供与所述第一表中的行与在所述第二表中没有匹配ID,所述第二EXCEPTION JOIN给出未在其他的方向一致的行。和UNIONs一起收集所有结果。