SQL NVL для нескольких столбцов таблиц - PullRequest
0 голосов
/ 06 мая 2020

Я хотел бы показать результат столбца SAL, так что если у них есть ежемесячная SAL, то показывать, если не показывать на сегодняшний день ежедневную SAL. Наша SAL на месяц отстает на 35 дней, поэтому мы хотели показать что-то вроде nvl (ежемесячно, ежедневно). Пытался следовать и застрял на том, как написать NVL поверх этих двух запросов

SELECT nvl(MNTH_SAL,DAILY_SAL) FROM(

SELECT sum(currsal)DAILY_SAL 
FROM SAL_DAILY WHERE
SAL_DATE=TO_CHAR(sysdate-1, 'YYYYMMDD')--SAL_DATE HAVE DATES LIKE 20200504
and EMP_ID='123' 

SELECT  sum(MSAL) MNTH_SAL
FROM SALY_MONTH
   WHERE 
     AND SAL_MDATE=  TO_CHAR(LAST_DAY(sysdate),'YYYYMM') ---SAL_MDATE HAVE DATES LIKE 202005
      and EMP_ID ='123'

)

см. Здесь образцы, которые мы выбираем из последних доступных ежедневных деталей SAL , поскольку ежемесячно еще нет этой даты?

daily       
SAL_DATE    EMP_ID  DSAL
20200501    123 273.21
20200502    123 2284021.99
20200503    123 21476932.57
20200504    123 22743859.69

monthly         
SAL_DATE    EMP_ID  MSAL
202004  123 34495.59
202004  123 1036951.62
202004  123 2086.69
202004  123 5429296.83

output for current month        
date    emp_id  sal
202005  123 46505087.46

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Вы можете взять UNION из двух запросов, сначала запрос monthly, а затем выбрать только первую строку из результата

SELECT "date", emp_id, sal
FROM (
  SELECT 0 AS rnk, 
         TO_CHAR(SAL_DATE) AS "date",
         emp_id,
         SUM(MSAL) AS sal
  FROM SALY_MONTH
  WHERE SAL_DATE = TO_CHAR(sysdate, 'YYYYMM')
    AND EMP_ID = 123
  GROUP BY SAL_DATE, EMP_ID
  UNION ALL
  SELECT 1,
         SUBSTR(SAL_DATE, 1, 6),
         emp_id,
         SUM(dsal)
  FROM SAL_DAILY
  WHERE SAL_DATE = TO_CHAR(SYSDATE-1, 'YYYYMMDD')
    AND EMP_ID = 123
  GROUP BY SUBSTR(SAL_DATE, 1, 6), EMP_ID
  ORDER BY rnk
) s
WHERE ROWNUM = 1

Вывод для ваших данных образца:

date    EMP_ID  SAL
202005  123     22743859.69

Демо на SQLFiddle

Обратите внимание, что это дает другой результат по сравнению с ожидаемым результатом, который суммирует все дневные зарплаты за май, даже если запрос только в вашем вопросе смотрит на позавчера. Если вы делаете хотите просуммировать все дневные зарплаты за май, измените эту строку:

WHERE SAL_DATE = TO_CHAR(SYSDATE-1, 'YYYYMMDD')

на

WHERE SUBSTR(SAL_DATE, 1, 6) = TO_CHAR(SYSDATE, 'YYYYMM')

И вы получите:

date    EMP_ID  SAL
202005  123     46505087.46

Демонстрация на SQLFiddle

0 голосов
/ 06 мая 2020

При вашем текущем подходе вам нужно заключить эти select операторы в круглые скобки.

SELECT NVL((SELECT sum(currsal)
            FROM SAL_DAILY 
            WHERE SAL_DATE=TO_CHAR(sysdate-1, 'YYYYMMDD') --SAL_DATE HAVE DATES LIKE 20200504
            AND EMP_ID='1234'), 
            (SELECT sum(MSAL)
             FROM SALY_MONTH
             WHERE SAL_MDATE=TO_CHAR(LAST_DAY(sysdate),'YYYYMM') ---SAL_MDATE HAVE DATES LIKE 202005
             AND EMP_ID ='1234'))
FROM DUAL;

Хотя идеальным подходом было бы union этих двух таблиц с использованием соответствующих столбцов и выполнения условной агрегации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...