You are correct. The true goal is to have just 4 values, Won, Lost, and Open Opportunity Quantities, and then the Shipped Quantities all summed with relation to a product.
Here is the tricky part:
Shipped Qty is a subset of the Won Quantity (how much of the opportunities that we "Won" have been shipped to the customer), so really, I wouldn't want it "grouped" with the three "Opportunity" Quantities. I want to essentially see some version of these two mockups from other platforms.
In this one, the black horizontal line represents the shipped qty:
In this one the second bar represents the shipped qty:
This is my latest attempt, but I'm still doesn't work:
MATCH (p:Party)-[:ASSIGNED_TO]->(f:Forecast{current_flg:'Y'})<-[:IS_ASSIGNED_TO]-(pr:Product),
(f)-[:SHIPS_FROM]->(city:City),
(f)-[:SHIPS_FROM]->(state:StateOrProvince),
(f)-[:SHIPS_FROM]->(coun:Country),
(f)-[:SHIPS_TO]->(city2:City),
(f)-[:SHIPS_TO]->(state2:StateOrProvince),
(f)-[:SHIPS_TO]->(coun2:Country),
//(f)<-[:CREATED]->(marketer:ContractOwner),
//(f)-[:TITLE_TRANSFER_AT]->(t:TitleTransfer),
//(f)-[:FORECASTED_FOR]->(i:Industry),
(f)-[:HAS_MODE]->(m:Mode)
WHERE p.name = $neodash_party_name
AND city.id = CASE WHEN isEmpty($neodash_city_id) THEN city.id ELSE $neodash_city_id END
AND f.forecast_month >= CASE WHEN isEmpty(toString($neodash_forecast_forecast_month_1)) THEN f.forecast_month ELSE $neodash_forecast_forecast_month_1 END
AND f.forecast_month <= CASE WHEN isEmpty(toString($neodash_forecast_forecast_month_2)) THEN f.forecast_month ELSE $neodash_forecast_forecast_month_2 END
//AND pr.type = CASE WHEN isEmpty($neodash_product_type) THEN pr.type ELSE $neodash_product_type END
WITH pr.type AS productType,
round(sum(f.won_opportunities_qty),2) AS won_qty,
round(sum(f.lost_opportunities_qty),2) AS lost_qty,
round(sum(f.open_opportunities_qty),2) AS open_qty,
round(sum(f.shipped_qty),2) AS shipped_qty
WITH productType, {Won:won_qty,Lost:lost_qty,Open:open_qty,Shipped:shipped_qty} AS typeQtyMap
//WITH productType, collect([productType,won_qty]) AS won,
//collect([productType,lost_qty]) AS lost,
//collect([productType,open_qty]) AS open,
//collect([productType,shipped_qty]) AS shipped
RETURN productType, typeQtyMap, keys(typeQtyMap) AS keys