Несоответствие набора символов в Oracle SQL - PullRequest
0 голосов
/ 16 октября 2018

В Oracle SQL Developer 3.1.07 Два нижеприведенных подзапроса работают правильно.Все, что я пытаюсь сделать, это объединить их вместе, но Oracle выдает ORA-12704: ошибка несоответствия набора символов.Я проверил похожие посты, чтобы проверить синтаксис UNION, и я не понимаю, откуда исходит ошибка.Операторы выбора выбирают поля из одинаковых столбцов в обоих запросах, поэтому проблем с типом данных быть не должно.

    SELECT assessmentid,
       claimdate,
       firstdiagnosis,
       affectedsystemdesc,
       thirdparty,
       SUM(settledamount) AS sam,
       param
  FROM (
  SELECT x.xclaimassessment.assessmentid,
         x.xclaimassessment.thirdparty,
         x.xclaimassessment.firstdiagnosis,
         x.xclaimassessment.affectedsystemdesc,
         x.xclaimassessment.claimdate,
         x.xclaimtreatmentinvoice.settledamount,
         'Q1' AS param
    FROM x.xclaimassessment left
    JOIN x.xclaimtreatment
  ON x.xclaimassessment.assessmentid = x.xclaimtreatment.assessmentid
    LEFT JOIN x.xclaimtreatmentinvoice
  ON x.xclaimtreatment.treatmentid = x.xclaimtreatmentinvoice.treatmentid
   WHERE ( ( icd9 = '501'
      OR icd9 = '162' )
     AND thirdparty = 'N' )
     AND months_between(
    SYSDATE,
    TO_DATE(
      x.xclaimassessment.claimdate
    )
  ) < 25
)
 GROUP BY assessmentid,
          claimdate,
          firstdiagnosis,
          affectedsystemdesc,
          thirdparty,
          param
UNION
SELECT assessmentid,
       claimdate,
       firstdiagnosis,
       affectedsystemdesc,
       thirdparty,
       SUM(settledamount) AS sam,
       param
  FROM (
  SELECT x.xclaimassessment.assessmentid,
         x.xclaimassessment.thirdparty,
         x.xclaimassessment.firstdiagnosis,
         x.xclaimassessment.affectedsystemdesc,
         x.xclaimassessment.claimdate,
         x.xclaimtreatmentinvoice.settledamount,
         'Q2' AS param
    FROM x.xclaimassessment left
    JOIN x.xclaimtreatment
  ON x.xclaimassessment.assessmentid = x.xclaimtreatment.assessmentid
    LEFT JOIN x.xclaimtreatmentinvoice
  ON x.xclaimtreatment.treatmentid = x.xclaimtreatmentinvoice.treatmentid
   WHERE months_between(
    SYSDATE,
    TO_DATE(
      x.xclaimassessment.claimdate
    )
  ) < 25
)
 GROUP BY assessmentid,
          claimdate,
          firstdiagnosis,
          affectedsystemdesc,
          thirdparty,
          param
HAVING SUM(settledamount) > 50000;

Помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 17 октября 2018

Хорошо, спасибо моему менеджеру, мистеру К., который на самом деле решил эту проблему.

Проблема была в столбце THIRDPARTY, который имеет одинаковый тип данных в обоих подзапросах.Чтобы решить проблему, мы использовали CAST ( поле AS VARCHAR (3)) в обоих подзапросах.

Мы определили поле проблемы, удалив все поля, кроме первого, из запросов изатем добавляем их по одному, пока не сломается.

Мы до сих пор не понимаем, почему возникла эта ошибка, поэтому любая информация по этому вопросу все равно будет оценена. Вот решениекод:

SELECT ASSESSMENTID,CLAIMDATE, FIRSTDIAGNOSIS, AFFECTEDSYSTEMDESC, THIRDP, SUM(SETTLEDAMOUNT) AS SAM, PARAM
FROM (
      SELECT X.XCLAIMASSESSMENT.ASSESSMENTID, CAST(X.XCLAIMASSESSMENT.THIRDPARTY AS VARCHAR(3)) AS THIRDP,
      X.XCLAIMASSESSMENT.FIRSTDIAGNOSIS, X.XCLAIMASSESSMENT.AFFECTEDSYSTEMDESC, 
      X.XCLAIMASSESSMENT.CLAIMDATE, X.XCLAIMTREATMENTINVOICE.SETTLEDAMOUNT, 'Q1' as PARAM
      FROM X.XCLAIMASSESSMENT
      LEFT JOIN X.XCLAIMTREATMENT
      ON X.XCLAIMASSESSMENT.ASSESSMENTID = X.XCLAIMTREATMENT.ASSESSMENTID
      LEFT JOIN X.XCLAIMTREATMENTINVOICE
      ON X.XCLAIMTREATMENT.TREATMENTID = X.XCLAIMTREATMENTINVOICE.TREATMENTID
      WHERE ((ICD9 = '501' or ICD9 = '162') and THIRDPARTY = 'N')and MONTHS_BETWEEN(SYSDATE,to_date(X.XCLAIMASSESSMENT.CLAIMDATE))< 25)
      GROUP BY  ASSESSMENTID, CLAIMDATE, FIRSTDIAGNOSIS, AFFECTEDSYSTEMDESC, THIRDP, PARAM
      UNION
SELECT ASSESSMENTID, CLAIMDATE, FIRSTDIAGNOSIS, AFFECTEDSYSTEMDESC, THIRDP, SUM(SETTLEDAMOUNT) AS SAM, PARAM
FROM(
      SELECT X.XCLAIMASSESSMENT.ASSESSMENTID, CAST(X.XCLAIMASSESSMENT.THIRDPARTY AS VARCHAR(3)) AS THIRDP,
      X.XCLAIMASSESSMENT.FIRSTDIAGNOSIS, X.XCLAIMASSESSMENT.AFFECTEDSYSTEMDESC, 
      X.XCLAIMASSESSMENT.CLAIMDATE, X.XCLAIMTREATMENTINVOICE.SETTLEDAMOUNT, 'Q2' as PARAM
      FROM X.XCLAIMASSESSMENT
      LEFT JOIN X.XCLAIMTREATMENT
      ON X.XCLAIMASSESSMENT.ASSESSMENTID = X.XCLAIMTREATMENT.ASSESSMENTID
      LEFT JOIN X.XCLAIMTREATMENTINVOICE
      ON X.XCLAIMTREATMENT.TREATMENTID = X.XCLAIMTREATMENTINVOICE.TREATMENTID
      WHERE MONTHS_BETWEEN(SYSDATE,to_date(X.XCLAIMASSESSMENT.CLAIMDATE))< 25)
      GROUP BY ASSESSMENTID, CLAIMDATE, FIRSTDIAGNOSIS, AFFECTEDSYSTEMDESC, THIRDP, PARAM
      HAVING SUM(SETTLEDAMOUNT) > 50000;    
...