SQL服务器不匹配列

时间:2014-05-24 20:13:59

标签: sql sql-server

我正在尝试为SQL Server编写查询。

  1. 必须将两个单独的列相加

  2. 如果列Debe小于列Haber,则应打印“不匹配”

  3. 解释是:

    • 有两个表ContDCont,共有一列ID
    • ContD有两个重要的列,DebeHaber
    • Cont有一个重要的列Importe

    如果Debe的总和不等于Haber的总和,则应该报告在另一列上打印消息。

    如果最终的数字DebeHaber相等,则与表Importe的列Cont相比较,并在另一列中打印重合

    http://www.grupoalta.com/wp-content/uploads/queryconciliacion.png

2 个答案:

答案 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;