ORACLE ROWNUM - PullRequest
       8

ORACLE ROWNUM

1 голос
/ 15 января 2009

У меня есть таблица сотрудников под названием ID_EMPLOYEE_MASTER с полями

EMP_CODE,
EMP_NAME,
EMP_JOIN_DATE,
EMP_STATUS,
EMP_BASIC,
EMP_ACCOUNT,
EMP_BANK

Я хочу опросить всех сотрудников, чей статус «P», т. Е ...PESENT, ИХ БАНКОВСКИЙ СЧЕТ, т. Е. EMP_ACCOUNT, ИХ БАЗОВЫЙ, т. Е. EMP_BASIC, ИМ. 1005 *

Я пробовал следующий запрос:

SELECT'01'||TO_CHAR(SYSDATE,'MMYY')||RPAD(EMP_ACCOUNT,16,'0')||
LPAD(EMP_BASIC,18,'0')||RPAD(EMP_NAME,32,'0')||LPAD(ROWNUM,4,'0')||
LPAD(EMP_CODE,10,'0') AS " " 
FROM ID_EMPLOYEE_MASTER WHERE EMP_STATUS='P' 
                        AND EMP_BANK='BM_CB' ORDER BY EMP_JOIN_DATE,ROWNUM

Я бы хотел, чтобы формат отображения был:

0115090023194700084016000000000002112000DILIPKUMARAG00000000000000000000010000000029

Проблема в том, что результат не отображается должным образом.

Если Дилип Кумар является самым старым сотрудником, его имя отображается первым, но его порядковый номер отображается не как 0001, а как 0013.

Другая проблема - зарплата, я хотел бы, чтобы она отображалась в OMANI RIALS и в некоторой BAISA, которая находится на 3 позиции после десятичной, но я не могу отобразить DAISA, отображаются только RIALS. Вывод, который я получаю, выглядит следующим образом:

0115090023194700084016000000000000002112DILIPKUMARAG0000000000000000000130000000029

Пожалуйста, помогите мне ...: (

Ответы [ 2 ]

7 голосов
/ 16 января 2009

ROWNUM назначается при извлечении строк до применения ORDER BY. Таким образом, они не будут выходить в той последовательности, которую вы хотите. Вы можете использовать несколько разных приемов.

(1) Вложенные запросы

SELECT <your long expression here> FROM (
  SELECT *
    FROM id_employee_master
  ORDER BY emp_join_date
  )

ROWNUM во внешнем запросе будут назначаться, когда строки возвращаются из внутреннего запроса, поэтому они будут отображаться в нужном вам порядке. Это что-то вроде хака.

(2) Аналитическая функция

Вместо ROWNUM используйте ROW_NUMBER() OVER ( ORDER BY emp_join_date ). Это назначит номера на основе этого явного порядка. Это гораздо более чистый способ сделать это.

По другой проблеме ... Я думаю, EMP_BASIC - это зарплата? Если это тип NUMBER, то вы неявно преобразуете его в строку, и форматирование по умолчанию будет отбрасывать незначительные цифры. Вы хотите использовать явный вызов TO_CHAR, чтобы указать точное форматирование, которое вы хотите.

0 голосов
/ 08 января 2015

Роунум не так .. помните:

SELECT * 
FROM  
( SELECT mt.mydata
  FROM myTable mt
  WHERE mt.myId = xxx
  ORDER BY mt.myDate DESC
) 
WHERE ROWNUM <= 1; --for example if you want last row 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...