Неверный вывод в запросе FULL OUTER JOIN - PullRequest
1 голос
/ 09 марта 2012

Структура таблицы:
tblCustomer

Customer_id  created                 field1            field2        cardno       field14
------------------------------------------------------------------------------------------------    
1014         2010-05-25 12:51:59.547 Cell Phone        abc@lmn.com   1234567890   Test Card
1015         2010-08-15 12:51:59.547 Email             abc@xyz.com   2345678891

tbl_TransactionDishout

Trnx_id   offerNo   TerminalID      Created                  VirtualCard
-------------------------------------------------------------------
1         1014      170924690436418 2010-05-25 12:51:59.547  1234567890

Можно ли получить результат, как показано ниже по дате записи:

               Enrolled   Enrolled as Email  Enrolled as Text Deals Redeemed   
<First Date>   7          5                  2                6
<Next Date>    9          3                  6               14

Существующий запрос:

SELECT
  convert(varchar, CAST(ISNULL(t1.created,t2.created) AS DATETIME), 111) created,
  COUNT(CASE WHEN (t1.field1 = 'E-mail' or t1.field1 = 'Cell Phone')  and (t1.field14 <> 'Test Card'  or t1.field14 is null) THEN 1 END) Enrolled,
  t1.field14,
  COUNT(CASE WHEN t1.field1 = 'E-mail'            and (t1.field14 <> 'Test Card'   and t1.field14 is null) THEN 1 END) Enrolled_as_Email,
  COUNT(CASE WHEN t1.field1 = 'Cell Phone'        and (t1.field14 <> 'Test Card'   and t1.field14 is null) THEN 1 END) Enrolled_as_Cell,
  COUNT(CASE WHEN t2.DishoutResponseCode = '0000' and (t1.field14 <> 'Test Card'   and t1.field14 is null) THEN 1 END) Deals_Redeemed
FROM
  tblCustomer AS t1
FULL OUTER JOIN
  tbl_TransactionDishout t2
    ON  t1.cardno = t2.VirtualCard
    AND t1.created = t2.created
GROUP BY
  convert(varchar, CAST(ISNULL(t1.created,t2.created) AS DATETIME),      111),
  t1.field14
ORDER BY
  convert(varchar, CAST(ISNULL(t1.created,t2.created) AS DATETIME), 111) DESC

Теперь я сталкиваюсь с одной проблемой: четвертый столбец выполняет что-то неправильно, потому что вчера у меня была одна запись в таблице tbl_TransactionDishout, у которой есть responsecode = 0000 и которая не является «Тестовой картой», но все же я получаю счет 0.

Отношение между tbl_transaction и tblCustomer имеет одно и то же cardno ...

1 Ответ

3 голосов
/ 09 марта 2012

Исходя из того, что вы сказали в разделе комментариев, я думаю, вам нужно изменить один фрагмент кода ...

  • Я хочу, чтобы на карте не было field14 как 'Test card'


(t1.field14 <> 'Test Card' and t1.field14 is null)

=>

(t1.field14 <> 'Test Card'  OR  t1.field14 is null)


Создайте логическую таблицу, чтобы проверить, действительно ли вы хотите AND или OR

field14     | (field14 <> 'Test Card') | (t1.field14 is null) | A OR B | A AND B
--------------------------------------------------------------------------------
'Test Card' |            FALSE         |        FALSE         | FALSE  | FALSE
NULL        |            NULL          |        TRUE          | TRUE   | FALSE
'Any Card'  |            TRUE          |        FALSE         | TRUE   | FALSE

1020 *
*

РЕДАКТИРОВАТЬ Следить за комментарием

Использование OR в приведенном выше коде не может дать TRUE, когда Field14 равно 'Test Card'. Оба теста дают FALSE, поэтому результат должен быть FALSE.

Вы должны разбить вещи на этапы. Отладка должна выполняться путем одновременного тестирования частей и постепенного доказательства того, что работает, чтобы изолировать, что нет. Никогда не пытайтесь разобраться во всем сразу, подходите к методике.

Запустить этот тест ...

SELECT
  *,
  CASE WHEN field14 <> 'Test Card'                     THEN 1 ELSE 0 END     Test1,
  CASE WHEN field14 IS NULL                            THEN 1 ELSE 0 END     Test2,
  CASE WHEN field14 <> 'Test Card' OR  field14 IS NULL THEN 1 ELSE 0 END     1_OR_2,
  CASE WHEN field14 <> 'Test Card' AND field14 IS NULL THEN 1 ELSE 0 END     1_AND_2
FROM
  tblCustomer
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...