У меня есть 2 запроса, которые я использовал для получения суммы значений на основе значения флага
SELECT SUM(stock_deliveries.stockValue) AS stockValues1
FROM 'stock_deliveries'
LEFT JOIN 'delivery' ON 'delivery'.'pk_deliveryId' = 'stock_deliveries'.'fk_deliveryId'
WHERE 'stock_deliveries'.'fk_stockID' = '189'
AND 'delivery'.'delivery_completed' = '1'
SELECT SUM(stock_deliveries.stockValue) AS stockValues2
FROM 'stock_deliveries'
LEFT JOIN 'delivery' ON 'delivery'.'pk_deliveryId' = 'stock_deliveries'.'fk_deliveryId'
WHERE 'stock_deliveries'.'fk_stockID' = '189'
AND 'delivery'.'delivery_completed' = '0
Можно ли объединить этот запрос в один запрос? заранее спасибо.
Вы можете использовать один запрос с помощью GROUP BY
SELECT SUM(stock_deliveries.stockValue) AS stockValues, 'delivery'.'delivery_completed' as deliveryCompleted
FROM 'stock_deliveries'
LEFT JOIN 'delivery' ON 'delivery'.'pk_deliveryId' = 'stock_deliveries'.'fk_deliveryId'
WHERE 'stock_deliveries'.'fk_stockID' = '189'
GROUP BY 'delivery'.'delivery_completed';
При этом у вас будет строка для каждого значения delivery_completed
с соответствующей суммой (если вам нужны только 0 и 1 значения, вы можете добавить к предложению where and delivery.delivery_completed IN (0,1)
). Пример:
stockValues deliveryCompleted
1000 0
700 1
Да, вы должны использовать условную агрегацию (т.е. CASE WHEN
внутри функции агрегации, такой как SUM
):
select
sum(case when d.delivery_completed = 0 then sd.stockvalue end) as stockvalues0,
sum(case when d.delivery_completed = 1 then sd.stockvalue end) as stockvalues1
from stock_deliveries sd
left join delivery d on d.pk_deliveryid = sd.fk_deliveryid
where sd.fk_stockid = 189;
delivery
. delivery_completed
= '0 и delivery
. delivery_completed
= '1'.
Вы можете использовать оператор UNION ALL
чтобы сохранить логику из двух строк результата, но теперь они находятся в одном и том же результате вместо 2 разделенных
вы можете использовать "if" внутри суммы, чтобы проверить, нужно ли вам значение в stockValues1
или stockValues0
SELECT SUM(IF(d.delivery_completed = 1, sd.stockValue, 0)) AS stockValues1, SUM(IF(d.delivery_completed = 0, sd.stockValue, 0)) AS stockValues2
FROM stock_deliveries sd
LEFT JOIN delivery d ON d.pk_deliveryId = sd.fk_deliveryId
WHERE sd.fk_stockID = '189'
AND (d.delivery_completed = 1 OR d.delivery_completed = 0)
очевидно, если "delivery_completed" - только 1 или 0, вы можете опустить последний AND
в запросе;)
Изменение: как сказал Торстен Кеттнер, вы также можете использовать синтаксис case-when, причем только один "случай" они по существу эквивалентны. Синтаксис if
в этом случае более краткий, но если у вас больше опций более гибкое, например:
SELECT CASE sometable
WHEN 'top' THEN 'high'
WHEN 'center' THEN 'medium'
ELSE 'low'
END AS position