Поставете подзаявка, която връща множество колони в FROM
списък и изберете от него.
Корелирана подзаявка би била лоша идея като начало. Вашето запитване обаче дори не е свързано, а несвързано (няма връзка към външна заявка) и изглежда връща множество редове. Това води до (вероятно много скъпо и безсмислено) кръстосано свързване, произвеждащо декартово произведение, което вероятно не е вашето (тайно) намерение.
Изглежда, че наистина искате:
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);
И двете LEFT JOIN
също са безсмислени. Този в sale
е принуден към INNER JOIN
от условието WHERE. Този на mat изглежда безсмислен, тъй като вие GROUP BY mat.mat
- освен ако се интересувате от mat IS NULL
? (Съмнявам се.)
Случаят вероятно може да бъде допълнително опростен до:
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
условието вероятно може да бъде опростено допълнително, в зависимост от вашите секретни типове данни и индекси. Изобилие от информация за точно този случай в този свързан отговор на dba.SE
.