CASE Заявление с Informix - PullRequest
       10

CASE Заявление с Informix

0 голосов
/ 27 ноября 2018

Я хочу обновить запрос к таблице Informix и мне нужна помощь.К сожалению, я не знал о различиях между SQL Server и Informix и получил отличный ответ здесь , который не работает.

По сути, я хочу создать новый столбецс именем Job_Account, которое пусто, если я возвратил Y в операторе CASE или если я возвратил N, отображает cus_num для записи, которая возвратила бы Y. Эти записи будут иметь разные номера клиентов, но совместно использовать cus_dun_no.Таким образом, в основном, если Main равен N, показать основной номер клиента (запись, которая вернула бы Y).

Результаты будут выглядеть примерно так:

Main    Job Account cus_cus_no      cus_lkp_nm  cus_nm

Y                   6625            ABC, INC.   ABC, INC.
N       6625        6694            ABC (123)   ABC, INC.(123)

Вот текущий запрос:

SELECT CASE 
    WHEN (
            cus_nm LIKE '%(%'
            AND cus_lkp_nm NOT LIKE '%REG%'
         )
        THEN 'N'
    ELSE 'Y'
    END AS Main
,*
FROM arrcus_rec
WHERE cus_dun_no IN (
    SELECT cus_dun_no
    FROM arrcus_rec
    WHERE cus_usg_sts = 'A'
    GROUP BY cus_dun_no
    HAVING COUNT(cus_dun_no) > 1
    )

Пример данных примера:

enter image description here

Вы можете увидеть примеры данных, показывающие учетные записи работы (в скобках), и яотмечены Y для основной учетной записи и N для рабочих счетов.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Я думаю, что это выдает результат, который вам нужен:

SELECT CASE 
       WHEN (A.cus_nm LIKE '%(%' AND A.cus_lkp_nm NOT LIKE '%REG%')
       THEN 'N'
       ELSE 'Y'
       END AS Main,
       CASE
       WHEN (A.cus_nm LIKE '%(%' AND A.cus_lkp_nm NOT LIKE '%REG%')
       THEN (SELECT B.cus_cus_no
               FROM arrcus_rec AS B
              WHERE B.cus_dun_no = A.cus_dun_no
                    -- Beware De Morgan
                AND (B.cus_nm NOT LIKE '%(%' OR B.cus_lkp_nm LIKE '%REG%')
            )
       ELSE NULL::INTEGER
       END AS Job_Account,
       *
  FROM arrcus_rec A
 WHERE cus_dun_no IN (
           SELECT cus_dun_no
             FROM arrcus_rec
          --WHERE cus_usg_sts = 'A'
            GROUP BY cus_dun_no
           HAVING COUNT(cus_dun_no) > 1
       )

Подзапрос в основном предложении WHERE дает ответ 6410981 на данные, указанные на изображении (данные с AFAKORI заметно видны).

Второе выражение CASE дает желаемый магический ответ.Он определяет, является ли эта строка не основной учетной записью, и выполняет подзапрос для получения соответствующей основной учетной записи или возвращает NULL::INTEGER (преобразование NULL в целочисленный тип), если это основная учетная запись.

Для данных примера:

cus_cus_no  cus_lkp_nm       cus_nm                           cus_dun_no
      6625  AFAKORI, INC.    AFAKORI, INC.                       6410981
      6694  AFAKORI, (594)   AFAKORI, INC,(LBCCD-BUILDING)       6410981
      6832  AFAKORI, (596)   AFAKORI, INC.(SECURITY COMPLEX)     6410981

результат показанного запроса:

main|job_account|cus_cus_no |cus_lkp_nm .    |cus_nm                          |cus_dun_no |
   Y|           |       6625|AFAKORI, INC.   |AFAKORI, INC.                   |    6410981|
   N|       6625|       6694|AFAKORI, (594)  |AFAKORI, INC,(LBCCD-BUILDING)   |    6410981|
   N|       6625|       6832|AFAKORI, (596)  |AFAKORI, INC.(SECURITY COMPLEX) |    6410981|
0 голосов
/ 27 ноября 2018

Я не знаю Informix, но в стандартном SQL существует семантическая проблема: count() в том же столбце, что не может работать group by, Having count(cus_dun_no)>1 может быть всегда ложным.

Этобыло бы, но без примера данных я слепой:

FROM arrcus_rec
WHERE cus_cus_no IN (
  SELECT cus_cus_no
  FROM arrcus_rec
  WHERE cus_usg_sts = 'A'
  GROUP BY cus_cus_no
  HAVING COUNT(cus_dun_no) > 1
)

Добавьте sql тег, пожалуйста:)

...