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

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

sql запрос [D5, Paradox]


denis24 ©   (2003-02-27 14:22:00) 

Есть две бд.В одной названия материалов(mater) ,во второй движения по ним(mov_mat)
mater имеет стр-ру (n_mat,n 2;nazv_mat c 40)
mov_mat (dat_m;n_mat,n 2;kol_mat,n 2;sost_mov-тип движения (приход расход),c 2)
Можно ли сделать такой запрос что бы результатом была такая таблица
Название материала,сумма по приходу,сумма по расходу.
Если делать просто select nazv_mat,sost_mov,sum(kol_mat) as P,sum(kol_mat) as R from mater,mov_mat group by sost_mov
то получается множество записей ,где сумма по каждому типу движения образует новую строку.


ЮЮ   (2003-03-05 03:32:00) [1]

а разносить их хочещь по по ещё 5 столбцам? Тогда ещё 5 Union-в


denis24   (2003-03-04 10:06:00) [2]

А если в поле sost_mov может быть не только "рх" и "пр" а еще штук пять типов ?


ЮЮ   (2003-03-01 03:29:00) [3]

>OneOfTheFew (28.02.03 11:24)
>и если сможете при помощи UNION сформировать структуру как у меня

Это рещение практически еженедельно появляется на страницах этого форума :-)

SELECT
N_mat,Nazv_mat,sum(Prihod) as Prihod,sum(Rashod) as Rashod
FROM
(
SELECT N_mat, Nazv_mat, Kol_mat Pihod, CAST(0 AS INTEGER)Rashod
FROM
Mov_mat
LEFT JOIN Mater ON Move_mat.N_mat =Mater.N_mat
WHERE Sost_mov="пр"
UNION
SELECT N_mat, Nazv_mat,0, Kol_mat
FROM
Mov_mat
LEFT JOIN Mater ON Move_mat.N_mat =Mater.N_mat
WHERE Sost_mov="рх"
) PrRx
GROUP BY N_mat,Nazv_mat
ORDER BY Nazv_mat

В PARADOX-е, в силу невозможности подзапросов в Local SQL, получаем:

SELECT N_mat,Nazv_mat,sum(Prihod) as Prihod,sum(Rashod) as Rashod
FROM PrRx.sql
GROUP BY N_mat,Nazv_mat
ORDER BY Nazv_mat

где текстовый файл "PrRx.sql", лежащий в каталоге с БД содержит:

SELECT N_mat, Nazv_mat, Kol_mat Pihod, CAST(0 AS INTEGER)Rashod
FROM Mov_mat LEFT JOIN Mater ON Move_mat.N_mat =Mater.N_mat
WHERE Sost_mov="пр"

UNION

SELECT N_mat, Nazv_mat,0, Kol_mat
FROM Mov_mat LEFT JOIN Mater ON Move_mat.N_mat =Mater.N_mat
WHERE Sost_mov="рх"

>denis24 (28.02.03 18:25)
>Ладно все нормально!Я уже с помощью временной таблицы сделал

Избавиться от этого можно было проще, используя для расхода отрицательные значения




OneOfTheFew   (2003-02-28 18:38:00) [4]

2 denis24

Ok!


denis24   (2003-02-28 18:25:00) [5]

Ладно все нормально!Я уже с помощью временной таблицы сделал


OneOfTheFew   (2003-02-28 17:24:00) [6]

2 denis24

Cлушай, извини ради Бога!!!

Если Ты хочешь получить такую таблицу в один "заход", то я предложил Тебе абсолютно неверное решение. Существует вариант решения в несколько этапов (достаточно быстро исполняемый даже на больших объемах данных), если Тебя конечно это устроит. И, если не ошибаюсь, можно еще при помощи Decision Cube (но с ним я никогда не работал).


denis24   (2003-02-28 16:36:00) [7]

Двойные значит что если в действительности по приходу было 10+20
то считает в колонке приход 60
10+20+10+20


OneOfTheFew   (2003-02-28 16:20:00) [8]

2 MsGuns , ЮЮ & Johnmen

ПОЗОР НА МОЮ СЕДУЮ ГОЛОВУ!!!
Мужики, почем у Вас платные уроки??? И как к Вам доехать???


P.S. Лучше пока помолчу, послушаю хороших ребят... :(


denis24   (2003-02-28 15:32:00) [9]

А подробней ,а то я на таком уровне sql плаваю
И еще можно ли использовать функцию iif() при вычислении поля
Что -то типа
select iif("field1=1,"H"."G") as new_field from ..........


Johnmen   (2003-02-28 15:20:00) [10]

Все правильно удваивается. Т.к. см. ЮЮ © (28.02.03 03:36)


OneOfTheFew   (2003-02-28 15:07:00) [11]

Че значит двойные ???


denis24   (2003-02-28 14:46:00) [12]

Все работает,только суммы двойные получаются


OneOfTheFew   (2003-02-28 11:40:00) [13]

Кстати, Ув. ЮЮ

Что значит "лишние записи"? Я осуществляю нормальный контроль "висячих строк" - постановка вопроса не оговаривает "Показать только те материалы, по которым было какое-либо движение"


OneOfTheFew   (2003-02-28 11:24:00) [14]

2 Johmen

По Distinct cогласен, просто скопировал подобный запрос из своих работ, но неошибочно.

2MsGuns & ЮЮ
А вот Вы, Дядьки, похоже неправы: внимательно прочитайте Вопрос и если сможете при помощи UNION сформировать структуру как у меня (и как просит Denis24), тогда я перед Вами Преклоню Колени и буду брать у Вас платные уроки :)


ЮЮ   (2003-02-28 03:36:00) [15]

Не столько проше, сколько правильнее, т.к. при LEFT JOIN получим лишние записи


MsGuns   (2003-02-27 23:29:00) [16]

>OneOfTheFew (27.02.03 17:18)

Мудрено. Проще через UNION


Johnmen   (2003-02-27 18:05:00) [17]

DISTINCT излишен...


OneOfTheFew   (2003-02-27 17:18:00) [18]

2 denis24
Могет тебе такое нужно ???

SELECT
DISTINCT
M.N_mat,
M.Nazv_mat,
sum(M1.Kol_mat) as Prihod,
sum(M2.Kol_mat) as Rashod
FROM
Mater M
LEFT OUTER JOIN Mov_mat as M1
ON ((M.N_mat=M1.N_mat) AND (M1.Sost_mov="пр"))
LEFT OUTER JOIN Mov_mat as M2
ON ((M.N_mat=M2.N_mat) AND (M2.Sost_mov="рх"))
GROUP BY
M.N_mat,
M.Nazv_mat


Наверх

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