assuming all inner join and data existent for stock table at location table and you are using sql server
select p.ProductDescription,s.NumberinLocation, (also add extra you want) from
(select pid=ProductID,ProductDescription from Products) as p,
(select spid=ProductID,slid=LocationID,NumberinLocation from Stock) as s,
(select llid=LocationID,LocationDescription from Location) as l
where p.pid=s.spid and s.slid=l.llid
OR
you can also drop to 2 tables if you need fewer fields as you stated
select p.ProductDescription,s.NumberinLocation, (also add extra you want) from
(select pid=ProductID,ProductDescription from Products) as p,
(select spid=ProductID,slid=LocationID,NumberinLocation from Stock) as s
, erase the comma

where p.pid=s.spid
after you need to transpose the result on product description either in excel or using some code..
I can send you a generic .net vb code that I have written for transposition if you need..
reason is for the required transposition you need mdx code for olap which is a bit more complicated and instead I use vb.net..