ORACLE ROWNUM

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

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

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

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

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

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

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

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

0115090023194700084016000000000000002112DILIPKUMARAG0000000000000000000130000000029

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

Измените это так, чтобы НЕ использовать все заглавные буквы. Также, пожалуйста, используйте целые, настоящие слова, такие как «должен» вместо «содрогнуться». Если вы создаете таблицы и пишете запросы в Oracle, я знаю, что вы можете это сделать.

BobbyShaftoe 15.01.2009 09:38

СВЯТОЙ ДЕРЬМО, ЧТО МНОГО ГЛАВНЫХ !!!! :)

Nathan W 15.01.2009 09:39

Трудное решение, для чего его закрывать - но заглавные буквы довольно оскорбительны.

Jonathan Leffler 15.01.2009 09:44

Хех, теперь еще смешнее, когда первое предложение все спокойно и красиво написано.

Jeremy Ruten 15.01.2009 09:45

Я потихоньку снимаю все шапки.

Nathan W 15.01.2009 09:47

Готово, все, что я оставил в кепках, я толком не понимал, может быть, кто-то еще может порезать.

Nathan W 15.01.2009 09:54

Хорошо, это исправлено, я говорю, откройте его.

BobbyShaftoe 15.01.2009 09:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
1 975
2

Ответы 2

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 - это зарплата? Если это числовой тип, то вы неявно преобразуете его в строку, и при форматировании по умолчанию будут отброшены незначительные цифры. Вы хотите использовать явный вызов TO_CHAR, чтобы указать точное форматирование, которое вы хотите.

rownum ошибается .. помнить:

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 

Другие вопросы по теме