Coloque una subconsulta que devuelva varias columnas en el FROM
lista y seleccione de ella.
Una subconsulta correlacionada sería una mala idea para empezar. Sin embargo, su consulta ni siquiera está correlacionada, sino no relacionada. (sin enlace a la consulta externa) y parece devolver varias filas. Esto conduce a una combinación cruzada (posiblemente muy costosa y sin sentido) que produce un producto cartesiano, probablemente no sea su intención (secreta).
Parece que realmente quieres:
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
también son inútiles. El que está en sale
se ve obligado a INNER JOIN
por la condición WHERE. El de mat parece inútil, ya que GROUP BY mat.mat
- excepto si está interesado en mat IS NULL
? (Lo dudo.)
El caso probablemente se puede simplificar aún más a:
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;
El WHERE
La condición probablemente se puede simplificar aún más, dependiendo de sus índices y tipos de datos secretos. Un montón de información precisamente sobre ese caso en esta respuesta relacionada en dba.SE
.