0

我有两个表需要比较以确保值匹配。对于上下文,一个是员工的时间表,另一个是保存他们请求的表格。每个都有时间表代码和小时数。我的计划是通过摘要进行比较,看看它们是否匹配。但是,我每次都无法让我的逻辑完美运行。如果没有我发布我的代码(无论如何它很快就会变得一团糟),你会如何解决这个问题?比较需要能够以编程方式运行,并最终返回真/假。

这可以是 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
4

6 回答 6

1

这将比较每个 ID 值在 A 和 B 中的总小时数,并且只返回 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
于 2011-03-09T21:52:01.517 回答
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 

由于从我拥有的接近但不准确的样本中进行调整和简化,可能需要进行细微的细节更改。不过,所有基本概念都应该清楚。

The CTE gives a couple summary "views" for use in the full statement. The INNER JOIN gives matching IDs with mismatched HOURS. The first EXCEPTION JOIN gives rows from the first table with no matching ID in the second table, and the second EXCEPTION JOIN gives rows that aren't matched in the other direction. And the UNIONs collect all results together.

于 2014-04-03T03:13:32.657 回答
0

一般来说,如果合并两个表,结果表的计数与单个表的计数相同,则可以说它们具有相同的值。

我不确定如何在您的情况下申请,但也许您可以。

于 2011-03-09T21:39:16.317 回答
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 标记,则它不起作用。

于 2011-03-09T21:57:04.460 回答
0

我最近做了这样的事情 - 这是我的笔记......结果集显示了值的差异以及一个表中存在但另一个表中不存在的行。

Step1:创建包含要比较的行的临时表。

步骤 2:使用非聚合列作为匹配标准对临时表执行 FULL 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  
于 2011-03-09T22:22:43.123 回答
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

它似乎有效,但似乎......过度。想法?有没有更好的办法?

于 2011-03-09T22:40:41.677 回答