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
.