2013-09-19 7 views
4

у меня есть таблица финансовых расходов, что есть данные, как это: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 
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 

Мне нужна запрос, который исключает пустоты и соответствующие им ОБВИНЕНИЕ, другими слова, , 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» и у него есть «VOID». Но я не уверен, как я могу сравнить две строки. Я привязал эту же таблицу в нескольких INNER JOINS (как описано здесь http://bit.ly/1a70mc2), но это не дало мне правильных результатов. Любые советы или направления очень ценятся!

UPDATE: tx_id, payor_id, orig_payor иногда не NULL, а иногда и не NULL.

+0

Это совпадение, что все линии с зарядами обратно имеют две tx_ids и NULL payor_id и orig_id? В противном случае есть ваши критерии. – SchmitzIT

+0

К сожалению, просто совпадение на образце, который я поставил здесь. – russds

ответ

2

Как насчет использования NOT EXISTS в любых записях, содержащих VOID и где tx_id s равны?

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 
    ) 
+0

Я мог бы попробовать, только то, что tx_id иногда имеет значение NULL. Если это намного проще/эффективнее любого другого маршрута, возможно, я смогу сделать обновление для tx_ids, которые являются NULL, поскольку они, похоже, всегда соответствуют первым 4,5,6 или 7 цифрам tdl_id. – russds

0

Я думаю, что самый безопасный вариант:

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

Таким образом, если вы аннулируются половину заряда, он показывает, что-нибудь, который проверяет, существует ли или не пустота для сделки исключит те, когда это не должно быть

Смежные вопросы