![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отчёт из 3 таблиц? [D5, MSSQL]
Slava_BAZ © (2002-09-13 07:09:00)Помогите пожалуйста написать SELECT. Имеется 3 таблицы, примерно с одинаковой структурой (ПРИХОД, РАСХОД, ЗАКАЗ) имеющие поля (ДАТА, НАИМЕНОВАНИЕ, КОЛИЧЕСТВО), где НАИМЕНОВАНИЕ это ссылка на справочник НАИМЕНОВАНИЙ.
Надо составить годовой помесячный отчёт по конкретному наименованию, где в столбцах будет (НАИМЕНОВАНИЕ, ЗАКАЗ, ПРИХОД, РАСХОД), а в строках сумма по КОЛИЧЕСТВУ по месяцам.
Что-то у меня не одной здоровой мысли не рождается. Попробывал так и эдак, но что-то всё не то
Заранее всем горомное спасибо!!!!!!!!!
Slava_BAZ (2002-09-13 10:11:00) [1]>Johnmen © (13.09.02 09:47)
У меня тоже получилось. Как говориться "А ларчик просто открывался" когда знаешь чем его открыть.
ЮЮ (2002-09-13 10:09:00) [2]2002 на дворе! Спецификации 1992 морально устарели :-)
Johnmen (2002-09-13 10:04:00) [3]>ЮЮ © (13.09.02 09:51)
Спасибо. Не думал я, что MS SQL в своем развитии так сильно отклонился от идеологии спецификации SQL92...
ЮЮ (2002-09-13 09:51:00) [4]Johnmen © (13.09.02 09:47)
Проверил практически, работает :-)
Johnmen (2002-09-13 09:47:00) [5]>ЮЮ © (13.09.02 08:39)
Ну скажем, высшая математика здесь непричем......:o)))
И меня очень интересует, а будет ли работать запрос вида
........
........
group by НАИМЕНОВАНИЕ,DATEPART(month,ДАТА) ?
Есть сильные сомнения...
Проверь ПРАКТИЧЕСКИ ! Если не сложно, сообщи о результатах...
Slava_BAZ (2002-09-13 09:47:00) [6]ЮЮ © (13.09.02 08:39)
Ещё раз огромное СПАСИБО! Надеюсь на поддержку в будущем, т.к. я ещё не волшебник, а только учусь.
ЮЮ (2002-09-13 09:40:00) [7]хранимая процедура, чаще всего, нужна, если трудно получить что-то одни запросом, когда сканируются разные таблицы для получения результата. В данном случае у нас один запрос, возвращающий только то, что нам надо. Будет он записан в ХП, или отправлен на сервер с клиента - нет никакой разницы.
По поводу твоего замечания Steven. Он дал общее направление. Добавь туда
where НАИМЕНОВАНИЕ=:НАИМЕНОВАНИЕ and DATEPART(year,ДАТА)=:ГОД
выборку и группировку по DATEPART(month,ДАТА) и получишь то, что требуется
Slava_BAZ (2002-09-13 09:26:00) [8]>Steven (13.09.02 08:12)
Класно, но немного не то. У тебя получилось объединение 3 таблиц по полю НАИМЕНОВАНИЕ, а мне бы надо по конкретному наименованию за год с разбивкой по месяцам. Но всё равно спасибо, т.к. никакие знания никогда не пропадают даром!
ЮЮ © (13.09.02 08:39)
Спасибо! Сижу разбираюсь, но если всё это запихать в один запрос получить "дикая штучка", или лучше это сделать через хранимую процедуру???????
ЮЮ (2002-09-13 09:06:00) [9]>Steven (13.09.02 08:12)
Тоже хорошо!!! А я всю мощь высшей математики бросил на решение школьного примера :-)
ЮЮ (2002-09-13 08:39:00) [10]>Что-то у меня не одной здоровой мысли не рождается
Тогда будем следовать поэтамно, чтобы мысль уловил и дальше следовал также :-)
1. Запрос, выбирающий всё из ЗАКАЗ для НАИМЕНОВАНИЕ в заданном ГОДУ с группировкой по месяцам будет иметь вид:
select НАИМЕНОВАНИЕ заказНАИМЕНОВАНИЕ , Count(КОЛИЧЕСТВО) заказКОЛИЧЕСТВО, DATEPART(month,ДАТА) заказМЕСЯЦ
from ЗАКАЗ where НАИМЕНОВАНИЕ=:НАИМЕНОВАНИЕ and DATEPART(year,ДАТА)=:ГОД group by НАИМЕНОВАНИЕ,DATEPART(month,ДАТА)
2.Аналогично для ПРИХОД
select НАИМЕНОВАНИЕ приходНАИМЕНОВАНИЕ , Count(КОЛИЧЕСТВО) приходКОЛИЧЕСТВО, DATEPART(month,ДАТА) приходМЕСЯЦ
from ПРИХОД where НАИМЕНОВАНИЕ=:НАИМЕНОВАНИЕ and DATEPART(year,ДАТА)=:ГОД group by НАИМЕНОВАНИЕ,DATEPART(month,ДАТА)
3. и РАСХОД :
select НАИМЕНОВАНИЕ расходНАИМЕНОВАНИЕ , Count(КОЛИЧЕСТВО) расходКОЛИЧЕСТВО, DATEPART(month,ДАТА) расходМЕСЯЦ
from РАСХОД where НАИМЕНОВАНИЕ=:НАИМЕНОВАНИЕ and DATEPART(year,ДАТА)=:ГОД group by НАИМЕНОВАНИЕ,DATEPART(month,ДАТА)
4. Объединим 1 и 2 запросы в один, не забывая о том, что в некоторых месяцах может быть запись в одном запросе и отсутствовать в другом:
select isnull(заказНАИМЕНОВАНИЕ,приходНАИМЕНОВАНИЕ) НАИМЕНОВАНИЕ,
isnull(заказМЕСЯЦ ,приходМЕСЯЦ) МЕСЯЦ, заказКОЛИЧЕСТВО,приходКОЛИЧЕСТВО
from ( запрос из п.1 ) ЗАКАЗ
full join ( запрос из п.2 ) ПРИХОД
on заказНАИМЕНОВАНИЕ=приходНАИМЕНОВАНИЕ and заказМЕСЯЦ=приходМЕСЯЦ
5. Аналогично обединим 4 и 3:
select isnull(НАИМЕНОВАНИЕ,расходНАИМЕНОВАНИЕ) НАИМЕНОВАНИЕ,
isnull(МЕСЯЦ ,расходМЕСЯЦ) МЕСЯЦ, заказКОЛИЧЕСТВО,приходКОЛИЧЕСТВО,расходКОЛИЧЕСТВО
from ( запрос из п.4 ) ЗАКАЗПРИХОД
full join ( запрос из п.3 ) РАСХОД
on НАИМЕНОВАНИЕ=расходНАИМЕНОВАНИЕ and МЕСЯЦ=расходМЕСЯЦ
6. И, наконец, подключим справочник:
Select * from ( запрос из п.5 ) ЗАКАЗПРИХОДРАСХОД
left join СПРАВОЧНИК on ЗАКАЗПРИХОДРАСХОД.НАИМЕНОВАНИЕ=СПРАВОЧНИК.НАИМЕНОВАНИЕ
И наслаждаемся мощью MS SQL сервера !!!
Slava_BAZ (2002-09-13 08:38:00) [11]Спасибо! Сейчас попробую.
Steven (2002-09-13 08:12:00) [12]select НАИМЕНОВАНИЕ, sum(Заказ), sum(Приход), sum(Расход)
from (
select НАИМЕНОВАНИЕ, КОЛИЧЕСТВО Заказ, 0 Приход, 0 Расход from ЗАКАЗ
union
select НАИМЕНОВАНИЕ, 0, КОЛИЧЕСТВО, 0 from ПРИХОД
union
select НАИМЕНОВАНИЕ, 0, 0, КОЛИЧЕСТВО from РАСХОД
) a
group by НАИМЕНОВАНИЕ