как построить SQL-запрос?
От: sushko Россия  
Дата: 03.03.17 13:23
Оценка:
Чета совсем туплю. На вот такой запрос:

SELECT
 sell_price AS sell,
 buy_price AS buy,
 sell-buy AS difference 
FROM
 ...


ругается: Column unknown: sell. А как правильно?

По условиям задачи вычитать нужно именно средствами SQL; писать sell_price-buy_price не хочу, т.к. в реальном запросе вместо sell_price стоИт вложенный селект на полэкрана.
Бесплатный генератор отчетов для программ на C/C++
http://www.oxetta.com
Re: как построить SQL-запрос?
От: Alex.Che  
Дата: 03.03.17 13:29
Оценка:
> А как правильно?

так правильно.
но это не весь текст.
Posted via RSDN NNTP Server 2.1 beta
Re: как построить SQL-запрос?
От: _ABC_  
Дата: 03.03.17 13:29
Оценка: 4 (1)
Здравствуйте, 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

До cross apply или аналогов.
Re[2]: как построить SQL-запрос?
От: sushko Россия  
Дата: 03.03.17 17:59
Оценка:
Здравствуйте, _ABC_, Вы писали:

S>>ругается: Column unknown: sell. А как правильно?

_AB>Правильно sell_price — buy_price.

Я же написал, что такой вариант неприемлем, т.к. запрос в моем исходном сообщении сильно упрощен, в реальном же запросе нет ни sell_price, ни buy_price, а вместо них есть вложенные запросы по полэкрана каждый. Сделать Ваш вариант — это продублировать каждый из них в поле difference, чего я, собственно, и стремлюсь избежать.
Бесплатный генератор отчетов для программ на C/C++
http://www.oxetta.com
Re[2]: как построить SQL-запрос?
От: sushko Россия  
Дата: 03.03.17 18:02
Оценка:
Здравствуйте, 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
Бесплатный генератор отчетов для программ на C/C++
http://www.oxetta.com
Отредактировано 03.03.2017 18:07 sushko . Предыдущая версия . Еще …
Отредактировано 03.03.2017 18:05 sushko . Предыдущая версия .
Re: как построить SQL-запрос?
От: Слава  
Дата: 03.03.17 18:52
Оценка: +1
Здравствуйте, sushko, Вы писали:

S>По условиям задачи вычитать нужно именно средствами SQL; писать sell_price-buy_price не хочу, т.к. в реальном запросе вместо sell_price стоИт вложенный селект на полэкрана.


Простыню ниже я внимательно не читал, но во некоторых SQL-движках имена полей, введенные через AS, нельзя использовать при вычислении других полей. Чтобы сделать то, что вы хотите — делайте подзапрос во FROM.
Re[3]: как построить SQL-запрос?
От: _ABC_  
Дата: 03.03.17 20:12
Оценка: +1
Здравствуйте, sushko, Вы писали:

S>Я же написал, что такой вариант неприемлем,

А дальше ты не читал из принципа...
Re[4]: как построить SQL-запрос?
От: sushko Россия  
Дата: 06.03.17 06:52
Оценка:
Здравствуйте, _ABC_, Вы писали:

S>>Я же написал, что такой вариант неприемлем,

_AB>А дальше ты не читал из принципа...

Гм... Да, не читал. Пошел читать
Бесплатный генератор отчетов для программ на C/C++
http://www.oxetta.com
Re[2]: как построить SQL-запрос?
От: sushko Россия  
Дата: 06.03.17 06:57
Оценка:
Здравствуйте, _ABC_, Вы писали:

_AB>Зависит от СУБД. Варианты от вложенных запросов типа


С вложенными запросами все понятно, как раз хочу их минимизировать. СУБД — SQLite и FireBird, т.е. и то, и другое.

_AB>До cross apply или аналогов.


Это, как я понял, фишка MSSQL, т.е. не про меня совсем.
Бесплатный генератор отчетов для программ на C/C++
http://www.oxetta.com
Re[3]: как построить SQL-запрос?
От: Jester Канада  
Дата: 17.03.17 03:40
Оценка:
Здравствуйте, 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 всё, что хочешь.
Re[3]: как построить SQL-запрос?
От: Jester Канада  
Дата: 17.03.17 04:19
Оценка:
Здравствуйте, 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). Ну или что у вас там эти икспенсы означают. А суммирование по продуктам и выбор нужного икспенса делать уже во внешнем селекте. Может, так выйдет лучше, может нет, не знаю. Но чисто по саппортабилити так будет, имхо, более понятно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.