Lägg en underfråga som returnerar flera kolumner i FROM
lista och välj från den.
En korrelerad underfråga skulle vara en dålig idé till att börja med. Din fråga är dock inte ens korrelerad, utan orelaterade (ingen länk till yttre fråga) och verkar returnera flera rader. Detta leder till (möjligen mycket dyrt och meningslöst) korskoppling som producerar en kartesisk produkt, förmodligen inte din (hemliga) avsikt.
Det verkar som att du verkligen vill:
SELECT m1.mat AS mat1, m1.sumtotal AS sumtotal1
,m2.mat AS mat2, m2.sumtotal AS sumtotal2
FROM (
SELECT mat.mat, sum(stx.total) AS sumtotal
FROM stx
LEFT JOIN mat ON mat.matid = stx.matid
LEFT JOIN sale ON stx.saleid = sale.id
WHERE stx.date BETWEEN '2013-05-01' AND '2013-08-31'
AND sale.userid LIKE 'A%'
GROUP BY mat.mat
) m1
JOIN (
SELECT mat.mat, sum(stx.total) AS sumtotal
FROM stx
LEFT JOIN mat ON mat.matid = stx.matid
LEFT JOIN sale ON sale.id = stx.saleid
WHERE stx.date BETWEEN '2013-05-01' AND '2013-08-31'
AND sale.userid LIKE 'b%'
GROUP BY mat.mat
) m2 USING (mat);
Båda LEFT JOIN
är också meningslösa. Den på sale
tvingas till en INNER JOIN
efter villkoret WHERE. Den på mattan verkar meningslös, eftersom du GROUP BY mat.mat
- förutom om du är intresserad av mat IS NULL
? (Jag tvivlar på det.)
Fallet kan förmodligen förenklas ytterligare till:
SELECT m.mat
,sum(CASE WHEN s.userid LIKE 'A%' THEN x.total END) AS total_a
,sum(CASE WHEN s.userid LIKE 'B%' THEN x.total END) AS total_b
FROM sale s
JOIN stx x ON x.saleid = s.id
JOIN mat m ON m.matid = x.matid
WHERE (s.userid LIKE 'A%' OR s.userid LIKE 'B%')
AND x.date BETWEEN '2013-05-01' AND '2013-08-31'
GROUP BY 1;
WHERE
skick kan förmodligen förenklas ytterligare, beroende på dina hemliga datatyper och index. En båtladd med information om just det fallet i det här relaterade svaret på dba.SE
.