Fügen Sie in FROM eine Unterabfrage ein, die mehrere Spalten zurückgibt Liste und wählen Sie daraus aus.
Eine korrelierte Unterabfrage wäre für den Anfang eine schlechte Idee. Ihre Abfrage ist jedoch nicht einmal korreliert, sondern unrelativ (kein Link zur äußeren Abfrage) und scheint mehrere Zeilen zurückzugeben. Dies führt zu einer (möglicherweise sehr teuren und unsinnigen) Kreuzverbindung, die ein kartesisches Produkt erzeugt, wahrscheinlich nicht Ihre (geheime) Absicht.
Sieht so aus, als ob Sie wirklich wollen:
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);
Beide LEFT JOIN sind auch sinnlos. Der im sale wird zu einem INNER JOIN gezwungen durch die WHERE-Bedingung. Das auf mat erscheint sinnlos, da Sie GROUP BY mat.mat verwenden - außer wenn Sie an mat IS NULL interessiert sind ? (Ich bezweifle es.)
Der Fall kann wahrscheinlich weiter vereinfacht werden zu:
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;
Das WHERE Bedingung kann wahrscheinlich weiter vereinfacht werden, abhängig von Ihren geheimen Datentypen und Indizes. Eine Schiffsladung Informationen zu genau diesem Fall in diese verwandte Antwort auf dba.SE
.