Coloque uma subconsulta que retorne várias colunas no
FROM
lista e selecione a partir dela. Uma subconsulta correlacionada seria uma má ideia para começar. No entanto, sua consulta não está correlacionada, mas não relacionada (sem link para consulta externa) e parece retornar várias linhas. Isso leva a uma junção cruzada (possivelmente muito cara e sem sentido) produzindo um produto cartesiano, provavelmente não sua intenção (secreta).
Parece que você realmente quer:
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);
Ambos
LEFT JOIN
também são inúteis. Aquele em sale
é forçado a um INNER JOIN
pela condição WHERE. O do mat parece inútil, já que você GROUP BY mat.mat
- exceto se você estiver interessado em mat IS NULL
? (Eu duvido.) O caso provavelmente pode ser simplificado ainda mais para:
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;
O
WHERE
condição provavelmente pode ser simplificada ainda mais, dependendo de seus tipos e índices de dados secretos. Um monte de informações sobre exatamente esse caso em esta resposta relacionada em dba.SE
.