我有一个名为ID_EMPLOYEE_MASTER
的员工表,其中包含字段
EMP_CODE,
EMP_NAME,
EMP_JOIN_DATE,
EMP_STATUS,
EMP_BASIC,
EMP_ACCOUNT,
EMP_BANK
我想查询状态为'P'的所有员工,即..PRESENT,他们的银行账户即...... EMP_ACCOUNT,他们的基本即EMP_BASIC,他们的名称即...... EMP_NAME,然后给出一个序列号,然后他们的{ {1}}
我尝试了以下查询:
EMP_CODE
我希望显示的格式为:
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
问题是结果无法正常显示。
如果Dilip Kumar是最年长的员工,他的名字会先显示,但他的序列号不会显示为0115090023194700084016000000000002112000DILIPKUMARAG00000000000000000000010000000029
,但会显示为0001
。
另一个问题是工资,我希望它显示在OMANI RIALS和一些BAISA,这是小数点后3位,但是我无法显示DAISA,只显示RIALS。我得到的输出如下:
0013
请帮助我...... :(
答案 0 :(得分:7)
在应用ORDER BY之前,在检索行时分配ROWNUM。所以他们不会按照你想要的顺序出来。你可以使用几种不同的技巧。
(1)嵌套查询
SELECT <your long expression here> FROM (
SELECT *
FROM id_employee_master
ORDER BY emp_join_date
)
外部查询中的ROWNUM将被分配为从innery查询返回的行,因此它们将按您想要的顺序出现。这有点像黑客。
(2)分析功能
使用ROW_NUMBER() OVER ( ORDER BY emp_join_date )
代替ROWNUM。这将根据显式排序分配数字。这是一种更清洁的方式。
关于另一个问题......我猜EMP_BASIC是薪水吗?如果它是NUMBER类型,那么您将隐式地将其转换为字符串,并且默认格式将丢失无关紧要的数字。您希望使用显式TO_CHAR调用来指定所需的确切格式。
答案 1 :(得分:-1)
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