SELECT
sell_price AS sell,
buy_price AS buy,
sell-buy AS difference
FROM
...
ругается: Column unknown: sell. А как правильно?
По условиям задачи вычитать нужно именно средствами SQL; писать sell_price-buy_price не хочу, т.к. в реальном запросе вместо sell_price стоИт вложенный селект на полэкрана.
Здравствуйте, sushko, Вы писали:
S>Чета совсем туплю. На вот такой запрос:
S>
S>SELECT
S> sell_price AS sell,
S> buy_price AS buy,
S> sell-buy AS difference
S>FROM
S> ...
S>
S>ругается: Column unknown: sell. А как правильно?
Правильно sell_price — buy_price.
S>По условиям задачи вычитать нужно именно средствами SQL; писать sell_price-buy_price не хочу, т.к. в реальном запросе вместо sell_price стоИт вложенный селект на полэкрана.
Зависит от СУБД. Варианты от вложенных запросов типа
select
sell,
buy,
sell-buy as difference
from (SELECT
sell_price AS sell,
buy_price AS buy
FROM
...
) t
Здравствуйте, _ABC_, Вы писали:
S>>ругается: Column unknown: sell. А как правильно? _AB>Правильно sell_price — buy_price.
Я же написал, что такой вариант неприемлем, т.к. запрос в моем исходном сообщении сильно упрощен, в реальном же запросе нет ни sell_price, ни buy_price, а вместо них есть вложенные запросы по полэкрана каждый. Сделать Ваш вариант — это продублировать каждый из них в поле difference, чего я, собственно, и стремлюсь избежать.
Здравствуйте, Alex.Che, Вы писали:
>> А как правильно?
AC>так правильно. AC>но это не весь текст.
Разумеется не весь. Весь запрос ниже; при исполнении запроса получаю ошибку Column unknown: income. Если последнее поле запроса убрать, то запрос выполняется без ошибок.
SELECT DISTINCT
goods.id,
goods.product_code,
goods.name,
SUM(waybill_items.quantity) AS quantity,
SUM(waybill_items.price * COALESCE(cur_rates.rate, 1.0) * waybill_items.quantity - waybill_items.discount) AS income,
SUM(waybill_items.vat * COALESCE(cur_rates.rate, 1.0)) AS vat,
CASE WHEN 0={переменная, подставляемая извне} THEN
SUM(waybill_items.buy_price * waybill_items.quantity)
ELSE
(SELECT SUM(_cost) FROM
(
SELECT
shipment_sales.buy_price * shipment_sales.quantity * COALESCE(currency_rates.rate, 1.0) AS _cost
FROM
shipment_sales,
waybill_items AS wi,
waybills AS wb LEFT OUTER JOIN currency_rates ON currency_rates.start_date=
(SELECT MAX(start_date)
FROM currency_rates
WHERE start_date<=wb.waybill_date AND
currency_rates.currency_id=wb.currency_id
)
WHERE
shipment_sales.is_production_sell=0 AND
shipment_sales.sell_item_id=waybill_items.id AND
shipment_sales.is_production_buy=0 AND
shipment_sales.buy_item_id=wi.id AND
wi.waybill_id=wb.id
UNION ALL
SELECT
shipment_sales.buy_price * shipment_sales.quantity * COALESCE(currency_rates.rate, 1.0) AS _cost
FROM
shipment_sales,
production LEFT OUTER JOIN currency_rates ON currency_rates.start_date=
(SELECT MAX(start_date)
FROM currency_rates
WHERE start_date<=production.production_date AND
currency_rates.currency_id=production.buy_currency_id
)
WHERE
shipment_sales.is_production_sell=0 AND
shipment_sales.sell_item_id=waybill_items.id AND
shipment_sales.is_production_buy=1 AND
shipment_sales.buy_item_id=production.id
)
)
END AS expense,
income - expense - vat AS total
FROM
goods,
waybills,
waybill_items LEFT OUTER JOIN currency_rates AS cur_rates
ON cur_rates.currency_id=waybills.currency_id AND
cur_rates.start_date=
(
SELECT MAX(start_date)
FROM currency_rates
WHERE start_date<=waybills.waybill_date AND
currency_rates.currency_id=waybills.currency_id
)
WHERE
goods.group_id=? AND
goods.is_deleted=0 AND
goods.id=waybill_items.goods_id AND
waybill_items.is_deleted=0 AND
waybill_items.waybill_id=waybills.id AND
waybills.is_deleted=0 AND
waybills.record_type=-1 AND
waybills.waybill_date>={переменная, подставляемая извне} AND
waybills.waybill_date<={переменная, подставляемая извне} AND
waybills.shop_id IN ({переменная, подставляемая извне}) AND
waybills.is_reserve=0
GROUP BY
product_code, name
ORDER BY
product_code, name
Здравствуйте, sushko, Вы писали:
S>По условиям задачи вычитать нужно именно средствами SQL; писать sell_price-buy_price не хочу, т.к. в реальном запросе вместо sell_price стоИт вложенный селект на полэкрана.
Простыню ниже я внимательно не читал, но во некоторых SQL-движках имена полей, введенные через AS, нельзя использовать при вычислении других полей. Чтобы сделать то, что вы хотите — делайте подзапрос во FROM.
Здравствуйте, sushko, Вы писали:
S>Здравствуйте, Alex.Che, Вы писали:
>>> А как правильно?
AC>>так правильно. AC>>но это не весь текст.
S>Разумеется не весь. Весь запрос ниже; при исполнении запроса получаю ошибку Column unknown: income. Если последнее поле запроса убрать, то запрос выполняется без ошибок.
<<длинный запрос поскипан>>
Вопросы:
1. Зачем делаешь distinct, если у тебя group by?
2. Куда из group by потерялся goods.id?
Советы:
1. Убери total из запроса.
2. Оберни сверху ещё одним селектом и делай с полями income, expense и vat всё, что хочешь.
Здравствуйте, sushko, Вы писали:
S>Здравствуйте, Alex.Che, Вы писали:
>>> А как правильно?
AC>>так правильно. AC>>но это не весь текст.
S>Разумеется не весь. Весь запрос ниже; при исполнении запроса получаю ошибку Column unknown: income. Если последнее поле запроса убрать, то запрос выполняется без ошибок.
С внешним селектом можно, кстати, запрос попробовать покрутить по-всякому. Например, можно сделать внутренний селект по waybill_items.id, то есть убрать суммы по income и vat, а expense разделить на три отдельных поля, типа expense_total (без SUM), expense_supplies и expense_production (два последних брать как сумму по закупочным waybills на один waybill_items.id). Ну или что у вас там эти икспенсы означают. А суммирование по продуктам и выбор нужного икспенса делать уже во внешнем селекте. Может, так выйдет лучше, может нет, не знаю. Но чисто по саппортабилити так будет, имхо, более понятно.