Google Answers Logo
View Question
 
Q: Respective column from joined table ( No Answer,   5 Comments )
Question  
Subject: Respective column from joined table
Category: Computers > Programming
Asked by: shantanuo-ga
List Price: $2.00
Posted: 05 Jun 2005 00:42 PDT
Expires: 05 Jul 2005 00:42 PDT
Question ID: 529479
Hi,
Here is the table in question.

drop table `portfolio1`;
CREATE TABLE `portfolio1` (
`ccode` varchar(99) default NULL,
`symbol` varchar(99) default NULL,
`transaction_date` date default NULL,
`rate` decimal(11,2) default NULL,
`quantity` int(11) default NULL,
`transaction` enum('buy','sell') default NULL
) TYPE=MyISAM;

INSERT INTO `portfolio1` VALUES ( 'soak', 'A', '2001-02-02', '345.92',
'50', 'buy');
INSERT INTO `portfolio1` VALUES ( 'soak', 'A', '2002-09-02', '345.92',
'100', 'buy');
INSERT INTO `portfolio1` VALUES ( 'soak', 'A', '2003-09-02', '345.92',
'150', 'buy');
INSERT INTO `portfolio1` VALUES ( 'soak', 'A', '2002-12-05', '500.00',
'100', 'sell');
INSERT INTO `portfolio1` VALUES ( 'soak', 'A', '2003-12-05', '900.00',
'175', 'sell');

INSERT INTO `portfolio1` VALUES ( 'soak', 'D', '2001-03-25', '39.90',
'500', 'buy');
INSERT INTO `portfolio1` VALUES ( 'soak', 'D', '2002-02-25', '39.90',
'100', 'buy');
INSERT INTO `portfolio1` VALUES ( 'soak', 'D', '2003-03-25', '39.90',
'300', 'buy');
INSERT INTO `portfolio1` VALUES ( 'soak', 'D', '2002-12-05', '67.00',
'200', 'sell');
INSERT INTO `portfolio1` VALUES ( 'soak', 'D', '2004-12-09', '87.00',
'200', 'sell');


query I know...

SELECT
sub1.ccode,
sub1.symbol,
SUM(sub1.quantity_buy) buy,
SUM(sub1.quantity_sell) sell,
(SUM(sub1.quantity_buy) - SUM(sub1.quantity_sell)) stock,
MAX(sub1.transaction_date) transaction_date
FROM
(
SELECT ccode, symbol, quantity quantity_buy, 0 quantity_sell, transaction_date
FROM `portfolio1` p
WHERE transaction = 'buy'
union all
SELECT ccode, symbol, 0, quantity quantity_sell, ''
FROM `portfolio1` p
WHERE transaction = 'sell'
) sub1
GROUP BY
sub1.ccode, sub1.symbol;


The results are as per my expectations.

ccode  symbol  buy  sell  stock  transaction_date  
soak A 300 275 25 2003-09-02 
soak D 900 400 500 2003-03-25 

But I do also want to know the corresponding quantity bought on that
particular transaction_date.

ccode |symbol | buy | sell | stock | transaction_date | bought
soak | A | 300 | 275 | 25 | 2003-09-02 | 150
soak | D | 900 | 400 | 500 | 2003-03-25 | 300


and if it is possible, the second last entry if the stock > bought like this...

ccode |symbol | buy | sell | stock | transaction_date | bought
soak | A | 300 | 275 | 25 | 2003-09-02 | 150
soak | D | 900 | 400 | 500 | 2003-03-25 | 300
soak | D | 900 | 400 | 500 | 2002-02-25 | 100
soak | D | 900 | 400 | 500 | 2001-03-25 | 100

Note: even if 500 quantity was bought on 2001-03-25 I want to display only 100
in the bought column above because 400 units have already been sold off.

I am using the latest version of mysql and oracle. 
So you can write a query that will work in either mysql or oracle (or
both. oracle prferred).
Answer  
There is no answer at this time.

Comments  
Subject: Re: Respective column from joined table
From: manuka-ga on 07 Jun 2005 02:13 PDT
 
Hi, I just want to clarify something - I'm not completely sure what you're after.

The first part is simple enough, just details of the latest
transaction. (One point, though: do you want a negative quantity to
display if the last transaction was a sell?) The second part is
confusing me a little. I think I've worked it out, but I want to
confirm that before I go and try to code it.

I think you want details of every occasion you've bought stock that
you are currently holding, assuming for simplicity that when you sell
stock you sell on an oldest-first basis. In other words we assume that
the 500 of stock D being held after all those transactions comes from
the two most recent buys plus 100 of the oldest buy, and you want to
display data for all these.

e.g. suppose I made the following transactions:

2004-01-01 buy 250
2004-02-01 sell 150
2004-03-01 buy 50
2004-04-01 sell 125
2004-05-01 buy 75

you want want to display 2004-03-01 buy 25 and 2004-05-01 buy 75. Correct?
Subject: Re: Respective column from joined table
From: oksoft-ga on 07 Jun 2005 04:48 PDT
 
One point, though: do you want a negative quantity to display if the
last transaction was a sell?

No. Stock balance can not be negative.
_____
e.g. suppose I made the following transactions:
2004-01-01 buy 250
2004-02-01 sell 150
2004-03-01 buy 50
2004-04-01 sell 125
2004-05-01 buy 75

you want want to display 2004-03-01 buy 25 and 2004-05-01 buy 75. Correct?

Yes. That's correct. Just add two more dimensions i.e. client code and product code.
Subject: Re: Respective column from joined table
From: manuka-ga on 07 Jun 2005 17:12 PDT
 
Hi oksoft,

I realise stock quantity can't be negative, but you said:
"But I do also want to know the corresponding quantity bought on that
particular transaction_date." 
The transaction date you're using is the date of the last transaction
on the stock, which could be either a buy or a sell. What do you want
to display if it was a sell?

Actually, there's another possibility I just thought of. It may be
that in fact you don't necessarily want the most recent transaction,
just the most recent buy. Is that correct? If so your current query is
incorrect in the case of the last transaction being a sell.
Subject: Re: Respective column from joined table
From: oksoft-ga on 07 Jun 2005 18:00 PDT
 
>> you don't necessarily want the most recent transaction, just the
most recent buy.
>> Is that correct? 
Yes.

>> If so your current query is incorrect in the case of the last
transaction being a sell.
In my test case, I am getting the correct latest transaction date of 'buy'. 
If you think the current query is wrong, 
a) Can you provide an example?
b) Can you correct it?
Subject: Re: Respective column from joined table
From: manuka-ga on 08 Jun 2005 02:03 PDT
 
Sorry, my mistake on that point. I'd forgotten that you weren't
returning the date in Sub1 for a sell transaction, so (since the first
transaction for any stock has to be a buy) the date of the latest buy
will indeed always be returned. However, I believe that in your first
line of results (for stock 'A') the amount shown at the end should be
25, not 150, since you have already sold all but 25 of this stock. Can
you confirm this?

If that's correct, the following code should do the trick.

SELECT ccode, symbol, Sub1.buy, Sub1.sell, 
  Sub1.buy - Sub1.sell AS stock, transaction_date, 
  p1.quantity - Sub1.sell + least(Sub1.past_buys, Sub1.sell) AS bought
FROM portfolio1 AS p1 INNER JOIN 
  (SELECT ccode, symbol, p2.transaction_date, 
    sum(decode(p3.transaction, 'buy', p3.quantity, 0)) AS buy,
    sum(decode(p3.transaction, 'sell', p3.quantity, 0)) AS sell,
    sum(decode(p3.transaction, 'buy', decode(sign(p3.transaction_date
- p2.transaction_date), -1, p3.quantity, 0), 0)) AS past_buys
  FROM portfolio1 p2 INNER JOIN portfolio1 p3 USING (ccode, symbol)
  GROUP BY ccode, symbol, p2.transaction_date) Sub1 
USING (ccode, symbol, transaction_date)
WHERE p1.transaction = "buy" AND p1.quantity + Sub1.past_buys > Sub1.sell;

Let me know if you have any trouble - I am more used to Oracle SQL but
I could only test it in Access, so the translation of this from Access
SQL back to Oracle SQL hasn't been tested. I think I got everything,
but possibly there's something lurking.

Regards, manuka-ga

Important Disclaimer: Answers and comments provided on Google Answers are general information, and are not intended to substitute for informed professional medical, psychiatric, psychological, tax, legal, investment, accounting, or other professional advice. Google does not endorse, and expressly disclaims liability for any product, manufacturer, distributor, service or service provider mentioned or any opinion expressed in answers or comments. Please read carefully the Google Answers Terms of Service.

If you feel that you have found inappropriate content, please let us know by emailing us at answers-support@google.com with the question ID listed above. Thank you.
Search Google Answers for
Google Answers  


Google Home - Answers FAQ - Terms of Service - Privacy Policy