我正在尝试为SQL Server编写查询。
必须将两个单独的列相加
如果列Debe
小于列Haber
,则应打印“不匹配”
解释是:
ContD
和Cont
,共有一列ID
ContD
有两个重要的列,Debe
和Haber
。Cont
有一个重要的列Importe
如果Debe
的总和不等于Haber
的总和,则应该报告在另一列上打印消息。
如果最终的数字Debe
和Haber
相等,则与表Importe
的列Cont
相比较,并在另一列中打印重合
http://www.grupoalta.com/wp-content/uploads/queryconciliacion.png
答案 0 :(得分:0)
这应该可以解决问题:
注意:我已经评论了您实际想要使用的脚本,未注释的脚本是我从您分享的屏幕截图中做出的快速示例,但正如@Horaciux所述请在下次加入样品。
注2:我认为表Cont中的id是主键,或者它只是Unique,同时表contD中的id是外键,或者它只是没有唯一性的约束。
DECLARE @t1 AS TABLE (id NUMERIC,debe DECIMAL(18,2),haber DECIMAL(18,2))
DECLARE @t2 AS TABLE (id NUMERIC,importe DECIMAL(18,2))
INSERT INTO @t1
SELECT 10887,NULL,603.2 UNION ALL
SELECT 10887,83.2,NULL UNION ALL
SELECT 10887,520,NULL UNION ALL
SELECT 10888,NULL,21.344 UNION ALL
SELECT 10888,18.40,NULL UNION ALL
SELECT 10888,2.944,NULL
INSERT INTO @t2
SELECT 10887,603.2 UNION ALL
SELECT 10888,150
SELECT id
,SUM(debe) 'Debe'
,SUM(haber) 'Haber'
,(SELECT importe FROM @t2 where id=t1.id) 'Importe'
,CASE WHEN SUM(debe)=SUM(haber) THEN '' ELSE 'not equal' END 'Debe=Haber'
,CASE WHEN (SUM(debe)=SUM(haber) AND (SELECT importe FROM @t2 WHERE id=t1.id)=SUM(debe)) THEN 'Coincidence' ELSE '' END 'Debe=Haber=Importe'
FROM @t1 t1
GROUP BY id
/*
SELECT id
,SUM(debe) 'Debe'
,SUM(haber) 'Haber'
,(SELECT importe FROM @t2 where id=t1.id) 'Importe'
,CASE WHEN SUM(debe)<>SUM(haber) THEN 'not equal' ELSE '' END 'Debe=Haber'
,CASE WHEN (SUM(debe)=SUM(haber) AND (SELECT importe FROM cont WHERE id=t1.id)=SUM(debe)) THEN 'Coincidence' ELSE '' END 'Debe=Haber=Importe'
FROM contd t1
GROUP BY id
*/
答案 1 :(得分:0)
这是一种进行比较并返回一个值的方法,具体取决于匹配的性质。这使用case
语句:
select cd.id,
(case when cd.sumdebe <> cd.sumhaber then 'not equals'
when cd.sumdebe = c.importe then 'all same'
else 'mismatch'
end)
from (select id, sum(debe) as sumdebe, sum(haber) as sumhaber
from contd
group by id
) cd left outer join
cont c
on cd.id = c.id;