SQL语句,用于排除符合特定条件的行

时间:2013-09-19 15:02:19

标签: sql sql-server sql-server-2008

我有一张财务费用表,其中包含以下数据:

tx_id    tdl_id     tx_num     detail_type_name     charges     payor_id    orig_payor
73765    737650000  1          CHARGE               320.00      1019        MEDI_CAL
7395     739500000  1          CHARGE               320.00      1253        THIPA/TORRANCE
7444     744400000  1          CHARGE               350.00      NULL        NULL
7444     744410000  1          VOID                 -350.00     NULL        NULL
7498     749800000  1          CHARGE               225.00      1011        UNITED HEALTH
750023   750023000  1          CHARGE               225.00      NULL        NULL
750023   750023100  1          VOID                 -225.00     NULL        NULL

我需要一个排除VOID及其相应CHARGES的查询,换句话说,是一个返回这些记录的sql语句:

tx_id    tdl_id     tx_num     detail_type_name     charges     payor_id    orig_payor
73765    737650000  1          CHARGE               320.00      1019        MEDI_CAL
7395     739500000  1          CHARGE               320.00      1253        THIPA/TORRANCE
7498     749800000  1          CHARGE               225.00      1011        UNITED HEALTH

不包括这些记录:

tx_id    tdl_id     tx_num     detail_type_name     charges     payor_id    orig_payor
7444     744400000  1          CHARGE               350.00      NULL        NULL
7444     744410000  1          VOID                 -350.00     NULL        NULL
750023   750023000  1          CHARGE               225.00      NULL        NULL
750023   750023100  1          VOID                 -225.00     NULL        NULL

我首先尝试使用如下语句来比较tdl_id:

 SELECT * FROM tablename
 WHERE LEFT(TDL_ID,4) IN (SELECT LEFT(TDL_ID,4)
               FROM tablename
               GROUP BY LEFT(TDL_ID,4)
               HAVING COUNT(*) < 2) 

但是这并没有成功,因为有些tdl_ids有4个相同的数字,有些是5,有的是6,还有7个。

我的第二个想法是比较2行并查看'detail_type_name'和'charge',这样我就可以比较两行,如果'CHARGES'相同,(一个是负数),一行有' CHARGE'和一个'VOID'。但我不确定如何比较两行。我在多个INNER JOINS中使用相同的表(如http://bit.ly/1a70mc2所述),但这并没有给我正确的结果。任何建议或方向都非常感谢!

更新 tx_id,payor_id,orig_payor有时不是NULL,有时不是NULL。

2 个答案:

答案 0 :(得分:2)

如何在包含VOID且tx_id s相等的任何记录上使用NOT EXISTS?

SELECT * FROM tablename O
WHERE detail_type_name = 'CHARGE'
    AND NOT EXISTS(
        SELECT TOP 1 1 FROM tablename I 
        WHERE I.detail_type_name = 'VOID' 
              AND I.tx_id = O.tx_id
    )

答案 1 :(得分:0)

我认为最安全的选择是:

select tx_id, sum(Charges) from tablename 
group by tx_id
having sum(charges)>0

这样,如果你取消了一半的费用,它会显示,任何检查交易是否存在空白的东西都会排除那些不应该

的费用。