Как объединить 2 запроса, которые проверяют одинаковые столбцы флага, но разные значения

0

У меня есть 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

Можно ли объединить этот запрос в один запрос? заранее спасибо.

Теги:

4 ответа

1
Лучший ответ

Вы можете использовать один запрос с помощью 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
  • 0
    Спасибо сработало
2

Да, вы должны использовать условную агрегацию (т.е. 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;
  • 0
    Спасибо за ответ @ Thorsten Kettner, мне нужно объединить вышеупомянутый запрос вместе с условными проверками и delivery . delivery_completed = '0 и delivery . delivery_completed = '1'.
  • 0
    Извините, я не понимаю, что вы говорите.
Показать ещё 2 комментария
0

Вы можете использовать оператор UNION ALL чтобы сохранить логику из двух строк результата, но теперь они находятся в одном и том же результате вместо 2 разделенных

0

вы можете использовать "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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню