Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SQL-запрос ОСТАТОК ТОВАРОВ НА СКЛАДЕ [D7, MSSQL, MySQL, Paradox]


Страницы:   1 2

vader ©   (2005-05-27 14:27:00) 

Помогите пожалуйста оформить SQL-запрос считающий остаток на складе. Имеется изначально такая таблица(см. ниже), где тип, если 0 - приход, если 1 - то расход соответствующего продукта. Приход и расход таким образом храниться в одной таблице и отличается только флагом Тип.

Продукт    | Кол-во | Тип
-------------------------
Помидор    | 30     | 0
Яблоко     | 40     | 0
Мясо       | 50     | 0
Сок        | 100    | 0
Помидор    | 10     | 1
Яблоко     | 20     | 1
Мясо       | 30     | 1
Помидор    | 5      | 1

После запроса надо получить такие выходные данные:

Продукт    | Расход | Приход | Осталось(Приход-Расход)
-----------------------------------------------------
Помидор    | 15     | 30     | 15
Яблоко     | 20     | 40     | 20
Мясо       | 30     | 50     | 20
Сок        | 0      | 100    | 100

т.е. считается общий расход для каждого продукта, и просто переносятся данные о приходе(где тип=0), а так же(это наверное вычисляемое поле) считается остаток как разница между приходом и расходом.

Чтобы получить приход, нужно выполнить:
SELECT *
FROM products.db
WHERE (tip>0)
ORDER BY name

а для расхода:
SELECT *
FROM products.db
WHERE (Tip>0)
GROUP BY name
ORDER BY name

Но необходимо чтобы всё это было в одном запросе и получились данные в таком виде, как представлено выше. Опыта у меня построения таких сложных отчётов почти нет. Что для этого надо использовать? Вложенные запросы, группировку или что?


Vader   (2005-05-27 18:24:00) [1]

Честно говоря, я уже потерял надежду такой сделать запрос. С вложенными не получилось, а тут оказывается и не возможно. Это точно? даже и пытаться не стоит? Замечательно... на BDE ч/з TTable я это ясно представляю как это сделать, только получается всё не так как я хотел, после той краткости что дается при использовании SQL снова погружаться в ту рутину и писать циклы в ломы, но тогда придётся. А всё-таки, точно никак не возможно? ;))


sniknik   (2005-05-27 18:19:00) [2]

> Я б конечно мог это сделать на BDE ч/з TTable
для локального(файлового) типа базы такой какой является парадокс, это было бы и более правильным.

> Я сейчас пробую написать вложенный запрос,
для BDE/Paradox-а? оставь надежду, он вложенных не поддерживает. так что подсказывать нечего... почти. можно только если сохранить запрос в файл .sql
вот тут обсуждалось, правда не совсем это но подробно ;о)
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1116909077&n=1


Vader   (2005-05-27 17:54:00) [3]

ANB, а ты не подскажешь как надо сделать это? Как написать?
Я сейчас пробую написать вложенный запрос, и сделать это в секции WHERE используя нечто предложенное тем же Johnmen.


ANB   (2005-05-27 17:50:00) [4]


> Я б конечно мог это сделать на BDE ч/з TTable

через TQuery делается точно так же. Тольк select * запихать надо.


Vader   (2005-05-27 17:43:00) [5]

Таблицу блюд можно назвать "recepts.db". И можно ли и как это сделать, повторно использовать сформированный запрос. В таком случае я бы сначала использовал запрос предложенный Johnmen-ом, потом бы по типу там посчитав используя recepts для вывода названия возможно ли приготовить такое блюдо и вывести его в результате? Можно так сделать, так будет лучше? Если да, то как повторно использовать в запросе ссылку на уже полученные данные от запроса Johnmen-а?


Vader   (2005-05-27 17:37:00) [6]

Здесь нужно как-то оформить вложенный запрос? Я сейчас как раз сижу и эспериментирую по этому поводу, только методом научного тыка, долго всё очень получается и пока ничего нет...


vader   (2005-05-27 17:35:00) [7]

А подскажите пожалуйста, если считать, что я принял последний вариант от Johnmen сделать так, что моя таблица вида:

Продукт    | Кол-во | Тип
-------------------------

является подчиненной, главной же является таблица вида:

Блюдо | Тип
--------------------------

где вот этот Тип и начинает фигурировать, он у меня сделан для связки двух этих таблиц: мастер-подчиненный. Т.е. имеется какое-то блюдо в мастер-таблице, его "тип" указывает на связь с подчиненной таблицей, в которой этому типу соответствуют те продукты которые входят в приготовлении этого блюда("тип">0, а "тип"=0 означает у меня приход продуктов). Нужно сделать такой запрос, чтобы выводились по нему только те названия блюд из имеющихся продуктов соответственно которых на складе можно приготовить эти блюда на N человек(N задается как параметр в программе).

Я б конечно мог это сделать на BDE ч/з TTable, по привычке, но коли решил на SQL, то хочу доделать и это будет куда более красивый и короткий вариант.


sniknik   (2005-05-27 16:46:00) [8]

> что там надо как-то через группировки делать или с помощью вложенного запроса?
и групировки и вложенные запросы... только не советую так делать. это пример того как не надо писать запросы

SELECT  
  [Продукт],
  (SELECT Sum([Кол-во]) FROM [База] b WHERE a.[Продукт]=b.[Продукт] AND [Тип] = 0) AS [Приход],
  (SELECT Sum([Кол-во]) FROM [База] b WHERE a.[Продукт]=b.[Продукт] AND [Тип] > 0) AS [Расход],
  (SELECT Sum(CASE WHEN [Тип] = 0 THEN [Кол-во] ELSE -[Кол-во] END) FROM [База] b WHERE a.[Продукт]=b.[Продукт]) AS [Осталось]
FROM [База] a
GROUP BY [Продукт]

это для MSSQL, парадокс(BDE) не поймет.


Vader   (2005-05-27 16:13:00) [9]

Спасибо тебе,Johnmen! Твой вариант работает отлично, то что мне надо. Я и не подумал что так можно, изначально думал, что там надо как-то через группировки делать или с помощью вложенного запроса? А можно ли на самом деле это сделать с помощью вложенного запроса? Про то что SET нет в Paradox я убедился уже сам, попробовал, но тоже об этом не знал. Тут специально подборку статей нашел по SQL, изучу в ближайшее время. Классная вещь! Sergey13, тебе тоже спасибо и за то что первый откликнулся!
Спасибо всем кто помог, этот фрагмент мне нужен был для курсача!


Johnmen   (2005-05-27 15:59:00) [10]

>Vader ©   (27.05.05 15:55) [13]

У тебя же Парадох, а там много чего нельзя. И этого (SET) тоже...:)
Ну и конечно красота дело индивидуальное, где-то даже интимное.
Ищи компромисс...


Vader   (2005-05-27 15:55:00) [11]

Спасибо, Johnmen! Я так понял что P.S. твой про X, значит что где X встречается в запросе его надо заменить на то выражение что стоит справа от него. Но это получиться некрасиво в итоге. Можно как-то в запросе вычислять этот X и подставлять потом? Например ч/з SET, или так нельзя?


Johnmen   (2005-05-27 15:31:00) [12]

SELECT
Товар,
SUM(количество*(1-X)) AS Приход,
SUM(количество*X) AS Расход,
SUM(количество*(1-X)-количество*X) AS Осталось
FROM products.db
GROUP BY Товар
ORDER BY Товар

где X=CAST(0.5-tip AS INT)+tip


Vader   (2005-05-27 15:17:00) [13]

И опять же,Sergey13, извини пожалуйста, но ты оказался абсолютно прав! РАБОТАЕТ!!! Это я просто немного прокосячил, но только потому, что тип у меня не всегда бывает 0 или 1, тот который 1, у меня меняется в широких масштабах, как быть тогда в таком случае? Что нужно исправить чтобы считалось правильно в том варианте о котором я изначально задумал.


sniknik   (2005-05-27 15:14:00) [14]

Vader ©   (27.05.05 15:11) [8]
критерий правильности? выдели сюда товар, его историю по которой считает не правильно, чтобы всем видно было.


Johnmen   (2005-05-27 15:14:00) [15]

Что-то у меня с глазами...:)))
Не заметил Sergey13 ©   (27.05.05 14:38) [1]


Vader   (2005-05-27 15:11:00) [16]

Sergey13, я попробовал твой вариант... Вроде работает, но что-то данные в итоге не совпадают, считает не правильно...


sniknik   (2005-05-27 15:11:00) [17]

> А БД у меня на Paradox!
а какого... билла гейтца тогда народ в заблуждение вводиш?

вариант
> Sergey13 ©   (27.05.05 14:38) [1]
вполне нормальный, немного только упростить надо, он там чересчур "завернул".


Johnmen   (2005-05-27 15:11:00) [18]

Если строго tip=0 приход, 1 расход, то
SELECT
 Товар,
 SUM(количество*(1-tip)) AS Приход,
 SUM(количество*tip) AS Расход,
 SUM(количество*(1-tip)-количество*tip) AS Осталось
FROM products.db
GROUP BY Товар
ORDER BY Товар


Vader   (2005-05-27 15:05:00) [19]

А БД у меня на Paradox!


Johnmen   (2005-05-27 15:00:00) [20]

>vader ©

Ты бы тип БД уточнил.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо