As MatBailie
pointed out, Sybase's lack of a PIVOT
function forces you to separate data presentation from data retrieval. Your options are limited to writing an inextensible kludge or restructuring the data in an intermediary application layer.
I opted to sacrificed scalability for the lack of an intermediary application layer.
My solution follows this form:
SELECT
[Scancode],
[Product Name],
MAX( CASE WHEN STO_FK = 1 THEN net.Total ELSE 0 END ) AS 'Tokyo Sales',
MAX( CASE WHEN STO_FK = 2 THEN net.Total ELSE 0 END ) AS 'New York Sales',
MAX( CASE WHEN STO_FK = 3 THEN net.Total ELSE 0 END ) AS 'London Sales'
FROM Items
JOIN (
SELECT ITM_FK, STO_FK, SUM([Quantity]) AS Total
FROM Sales
JOIN Stores
ON Stores.PK = Sales.STO_FK
GROUP BY ITM_FK, STO_FK
) AS net
ON Items.PK = net.ITM_FK
GROUP BY
[Scancode],
[Product Name]