需要帮助以降序显示属性(Oracle SQL)
我正在编写一个oracle sql过程,列出前10个客户的客户订单。但是,需要的一个要求是按降序输出属性total price,这是我无法实现的。相反,输出按顺序键排序。需要任何帮助,使输出按总价降序排序。我也在尝试将日期完整打印出来,例如:1995年11月1日,而不是我目前得到的1995年11月1日 [现行守则]需要帮助以降序显示属性(Oracle SQL),sql,oracle,plsql,Sql,Oracle,Plsql,我正在编写一个oracle sql过程,列出前10个客户的客户订单。但是,需要的一个要求是按降序输出属性total price,这是我无法实现的。相反,输出按顺序键排序。需要任何帮助,使输出按总价降序排序。我也在尝试将日期完整打印出来,例如:1995年11月1日,而不是我目前得到的1995年11月1日 [现行守则] set linesize 100 set pagesize 200 set serveroutput on set line 256 -- -- Task 02 create or
set linesize 100
set pagesize 200
set serveroutput on
set line 256
--
-- Task 02
create or replace procedure showCustomerOrders is
previousCustomer CUSTOMER.c_custkey%type := -1;
begin
for currentRow IN (select c_custkey,
c_name,
o_custkey,
o_orderdate,
o_orderkey,
o_totalprice
from customer
left outer join orders
on c_custkey = o_custkey
where c_custkey in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
order by c_custkey,
c_name,
o_custkey,
o_orderkey,
o_orderdate,
o_totalprice DESC) loop
if previousCustomer != currentRow.c_custkey then
dbms_output.put_line(chr(10)); -- new line
dbms_output.put_line(currentRow.c_custkey || ' - ' ||
currentRow.c_name || ':');
end if;
--
if currentRow.o_custkey is not null then
dbms_output.put_line(chr(9) ||
lpad(trim(to_char(currentRow.o_orderkey)), 12) || ', ' ||
lpad(trim(to_char(currentRow.o_orderdate)), 12) || ', ' ||
rpad(trim(to_char(currentRow.o_totalprice,
'$999G999G999D99')),
14));
end if;
--
previousCustomer := currentRow.c_custkey;
end loop;
dbms_output.put_line(null);
end;
/
show error
[当前输出]
1 - Customer#000000001:
385825, 01-NOV-95, $254,563.49
430243, 24-DEC-94, $37,713.17
454791, 19-APR-92, $78,172.70
579908, 09-DEC-96, $43,874.94
1071617, 10-MAR-95, $156,748.63
1374019, 05-APR-92, $189,636.00
1590469, 07-MAR-97, $59,936.41
1755398, 12-JUN-97, $1,466.82
1763205, 28-AUG-94, $18,112.74
您只需要重新排列SQL语句,如
SELECT c_custkey, c_name, o_custkey, TO_CHAR(o_orderdate,'DD-Mon-YYYY') AS o_orderdate,
o_orderkey, o_totalprice
FROM
(
SELECT c.*, o.*,
DENSE_RANK() OVER (ORDER BY o_totalprice DESC) AS dr
FROM customer c
LEFT JOIN orders o
ON c_custkey = o_custkey
)
ORDER BY dr
其中,您只需要在orderby
列表中的o_totalprice
列
如果DBMS的版本为12+
,则直接使用ORDER BY
列表中的分析功能:
SELECT c_custkey, c_name, o_custkey, TO_CHAR(o_orderdate,'DD-Mon-YYYY') AS o_orderdate,
o_orderkey, o_totalprice
FROM customer c
LEFT JOIN orders o
ON c_custkey = o_custkey
ORDER BY DENSE_RANK() OVER (ORDER BY o_totalprice DESC)
FETCH FIRST 10 ROWS ONLY
您只需要重新排列SQL语句,如
SELECT c_custkey, c_name, o_custkey, TO_CHAR(o_orderdate,'DD-Mon-YYYY') AS o_orderdate,
o_orderkey, o_totalprice
FROM
(
SELECT c.*, o.*,
DENSE_RANK() OVER (ORDER BY o_totalprice DESC) AS dr
FROM customer c
LEFT JOIN orders o
ON c_custkey = o_custkey
)
ORDER BY dr
其中,您只需要在orderby
列表中的o_totalprice
列
如果DBMS的版本为12+
,则直接使用ORDER BY
列表中的分析功能:
SELECT c_custkey, c_name, o_custkey, TO_CHAR(o_orderdate,'DD-Mon-YYYY') AS o_orderdate,
o_orderkey, o_totalprice
FROM customer c
LEFT JOIN orders o
ON c_custkey = o_custkey
ORDER BY DENSE_RANK() OVER (ORDER BY o_totalprice DESC)
FETCH FIRST 10 ROWS ONLY
这不起作用,因为它真的把我的输出搞砸了。但是谢谢你告诉我,通过改变序列,我可以改变排序过程。到目前为止,oracle sql仍然非常陌生。Thx的帮助,这没有工作,因为它真的搞砸了我的输出。但是谢谢你告诉我,通过改变序列,我可以改变排序过程。到目前为止,oracle sql仍然非常陌生。谢谢你的帮助,谢谢你的帮助!这真的很有帮助。谢谢你的帮助!这真的很有帮助。