Thanks Jay,
I had to make a change to the first part of the query to get the results that I
wanted but your suggestion was definitely what I needed to get to the solution.
Thanks again.
For those that are interested, here's the final solution,
INSERT INTO purchase (Source, Item, Qty)
SELECT 1, totals.Item,if((totals.TotQty -r.Qty)>0,r.qty, totals.TotQty)
FROM request r
JOIN
(SELECT Item, SUM(Qty) AS TotQty
FROM inventory
GROUP BY Item) AS totals
ON r.Required = totals.Item
UNION All
SELECT 0, totals.Item, (r.Qty - totals.TotQty)
FROM request r
JOIN
(SELECT Item, SUM(Qty) AS TotQty
FROM inventory
GROUP BY Item) AS totals
ON r.Required = totals.Item
WHERE r.Qty > totals.TotQty;
>>> On 8/10/07 at 12:33 PM, in message <[EMAIL PROTECTED]>, Jay Pipes <[EMAIL
>>> PROTECTED]> wrote:
Ed Reed wrote:
> Hi All,
>
> I have an issue that I need to resolve that is difficult to explain. I
> hope that someone can understand what I*m trying to do and shed some
> light on a solution. Here goes.
>
> I have three tables, inventory, which is a list of transactions with
> positive and negative values; request, which essentially is a temporary
> table that gets deleted after it*s used here; and purchase, which holds
> the solution as to whether an item is to be purchased or removed from
> inventory,
>
> CREATE TABLE `inventory` (
> `id` bigint(20) NOT NULL AUTO_INCREMENT,
> `Item` varchar(100) NOT NULL DEFAULT '',
> `Qty` int(11) NOT NULL DEFAULT '0',
> PRIMARY KEY (`id`)
> ) ENGINE=MyISAM AUTO_INCREMENT=13 DEFAULT CHARSET=latin1;
>
> CREATE TABLE `purchase` (
> `id` bigint(20) NOT NULL AUTO_INCREMENT,
> `Source` int(11) DEFAULT NULL,
> `Item` varchar(100) NOT NULL DEFAULT '',
> `Qty` int(11) NOT NULL DEFAULT '0',
> PRIMARY KEY (`id`)
> ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
>
> CREATE TABLE `request` (
> `id` bigint(20) NOT NULL AUTO_INCREMENT,
> `Required` varchar(100) NOT NULL DEFAULT '',
> `Qty` int(11) NOT NULL DEFAULT '0',
> PRIMARY KEY (`id`)
> ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
>
> My Inventory and Request tables have data in them like this,
>
> Insert Into `inventory` (Item, Qty)
> Values
> ('Apples',5),
> ('Bananas',4),
> ('Cherries',6),
> ('Apples',-1),
> ('Bananas',1),
> ('Cherries',-2),
> ('Apples',3),
> ('Bananas',-7),
> ('Cherries',19),
> ('Apples',-5),
> ('Bananas',88),
> ('Cherries',6);
>
> Insert Into `request` (Required, Qty)
> Values
> ('Apples', 12),
> ('Bananas', 112),
> ('Cherries', 5);
>
> Now what I*d like to do is create a single Insert Select query that
> creates a record in my purchase table for each of the items in my
> request table based on the number of items available in my inventory.
> But, if there aren't enough items in the inventory to cover the amount
> requested, I need to have a second record for that item in the purchase
> table with the qty difference to another source. So based on the data in
> the inventory my current totals are,
>
> +----------+----------+
> | Item | Sum(Qty) |
> +----------+----------+
> | Apples | 2 |
> | Bananas | 86 |
> | Cherries | 29 |
> +----------+----------+
>
> and based on the qty of items in my request I would like to have a
> purchase table that looks like this,
>
> +--------+----------+-----+
> | Source | Item | Qty |
> +--------+----------+-----+
> | 1 | Apples | 2 |
> | 0 | Apples | 10 |
> | 1 | Bananas | 86 |
> | 0 | Bananas | 26 |
> | 1 | Cherries | 5 |
> +--------+----------+-----+
>
> with a source of 1 meaning pull the items from inventory and a source
> of 0 means purchase them from somewhere else.
>
> Can anyone help me with this?
Try this:
INSERT INTO purchase (Source, Item, Qty)
SELECT
1, totals.Item, r.Qty
FROM request r
JOIN (
SELECT Item, SUM(Qty) AS TotQty
FROM inventory
GROUP BY Item
) AS totals
ON r.Required = totals.Item
WHERE r.Qty <= totals.TotQty
UNION ALL
SELECT
0, totals.Item, (r.Qty - totals.TotQty)
FROM request r
JOIN (
SELECT Item, SUM(Qty) AS TotQty
FROM inventory
GROUP BY Item
) AS totals
ON r.Required = totals.Item
WHERE r.Qty > totals.TotQty;
cheers,
Jay