Hello,
I have 3 tables.
orders
--
orderID PK
symbol
price
accountNumber
matchStatus
orderDate
volume
side
executions
--
executionID
symbol
price
mcName
orderDate
orderTime
volume
side
accounts
----
accountID
accountNumber
mcName
What I have so far.
select o.orderid, abs(o.volume), sum(e.volume)
from orders o, executions e, accounts a 
where a.accountNumber = o.accountNumber and e.mcName = a.mcName
and o.matchStatus IS NULL and e.orderID IS NULL 
and left(e.side, 1) = left(o.side, 1) 
and o.orderDate = e.executionDate
and o.symbol = e.symbol
group by o.orderid, e.volume, o.volume
having sum(e.volume) = abs(o.volume)
**************************************************  8
I put this in the select statement as a debug statementm abs
(o.volume), sum(e.volume).
What I need to do is this.
I need to get the orderID from the orders table for records where all 
the where statement clauses match up and the abs value of o.volume 
equals the sum of v.volume for all records that match the the where 
clause.  It will always be one record in the orders table and will be 1 or 
more records in the execution table that will match up.
How do I do this?
Right now I get 0 records because the group by isn't working to well.
here is a sample return set if I don't have the HAVING statement.
ORDERID   ABS          SUM
2219 434 271
2219 434 500
4125 2000 400
4125 2000 700
4125 2000 900
4129 2000 300
4129 2000 400Take e.volume out of the GROUP BY clause and you should get:
select o.orderid, abs(o.volume), sum(e.volume)
from orders o, executions e, accounts a 
where a.accountNumber = o.accountNumber and e.mcName = a.mcName
and o.matchStatus IS NULL and e.orderID IS NULL 
and left(e.side, 1) = left(o.side, 1) 
and o.orderDate = e.executionDate
and o.symbol = e.symbol
group by o.orderid, abs(o.volume);
ORDERID   ABS          SUM
2219 434 771
4125 2000 2700
Then put your HAVING back in.|||Thanks worked like a charm.
Do you mind if I ask you another question?
How about if I want to to do an update statement on the returned recordset.
Something like 
update executions 
set orderID = 
(
select o.orderid
from orders o, executions e, accounts a 
where a.accountNumber = o.accountNumber and e.mcName = a.mcName
 and o.matchStatus IS NULL and e.orderID IS NULL 
 and left(e.side, 1) = left(o.side, 1) 
 and o.orderDate = e.executionDate
 and o.symbol = e.symbol
group by o.orderid, abs(o.volume)
having sum(e.volume) = abs(o.volume)
)
WHERE orderID IS NULL
Unfortunately my subselect returns multiple records.
What is the best way around this?|||I don't really understand what you want to do.|||I want to update executions.orderid to orders.orderid where the conditions are met.
I found my old code and it went like this.
UPDATE executions
SET orderID =
   (
 SELECT O.orderID
    FROM orders AS O JOIN accounts AS A ON O.accountnumber = A.accountnumber
 WHERE O.symbol = executions.symbol AND A.mcname = executions.mcname
  AND LEFT(o.side, 1) = LEFT(executions.side, 1) AND O.orderDate = executions.executionDate
  AND O.orderID in 
   (
   select o2.orderID
   from orders o2, executions ee2, accounts aa
   where LEFT(o2.side, 1) = LEFT(ee2.side, 1) and o2.symbol = ee2.symbol and
    aa.MCName = ee2.MCName AND aa.accountNumber = o2.accountNumber AND o2.orderDate = ee2.executionDate
    AND ee2.orderID IS NULL and o2.matchStatus IS NULL
   group by o2.orderID, o2.volume
   HAVING SUM(ee2.volume) = ABS(o2.volume)
   )
 )
WHERE orderID IS NULL
update orders 
set matchStatus = 1
where orders.matchStatus IS NULL AND orders.orderID IN 
 (
 select executions.orderID 
 from executions
 where executions.orderID IS NOT NULL
 )
 
没有评论:
发表评论