我已经使用SQL超过25年,但我对Oracle相对较新.我以前的经验是在DB2和SQL Server中.
我被要求编写一个脚本,通过以下布局查看表:
OrderNo int
ClientID varchar(20)
Order_Date datetime
ProductCode varchar(5)
CreditLimit money
AccountNo varchar(25)
用户在每个订单上输入客户的CreditAccountNo.(我知道它应该从一个表中提取,但它是一个自行开发的应用程序,并且他们没有这样写.有一天,我会让他们让我解决这个问题.)
问题是,虽然有些客户确实有多个信用账户,但大多数只有一个.但是用户经常错误地输入错误的帐号.他们希望我编写一个查看每个clientid的脚本,并显示表中有多个帐号的客户端.
通常,我会有这样的东西(伪代码):
ClientID Cursor
Read distinct ClientID
Order Cursor
Read Order Record for ClientID
If first iteration, set variable X = AccountNo
If AccountNo <> X print ClientID, X, AccountNo
Read next row
Loop
Read next row
Loop
Run Code Online (Sandbox Code Playgroud)
我想知道是否没有PL/SQL命令让我废除第二个循环.
希望这个问题有道理.
为什么不呢?
SELECT distinct client_id, accountNo
FROM (
SELECT client_id,
accountNo,
count(distinct accountNo)
over ( partition by client_id) client_account_count
FROM your_table
)
where client_account_count > 1;
Run Code Online (Sandbox Code Playgroud)
根据Justin Cave的评论中的建议,为每个帐号添加了行数.这有助于区分可能正确的帐号和可能错误的帐号.
SELECT distinct client_id, accountNo, cnt
FROM (
SELECT client_id, accountNo,
count(distinct accountNo) over ( partition by client_id) client_account_count,
count(*) over ( partition by client_id, accountNo) cnt
FROM your_table
)
where client_account_count > 1;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1145 次 |
| 最近记录: |