Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.03;
Скачать: CL | DM;

Вниз

Отчёт из 3 таблиц?   Найти похожие ветки 

 
Slava_BAZ   (2002-09-13 07:09) [0]

Помогите пожалуйста написать SELECT. Имеется 3 таблицы, примерно с одинаковой структурой (ПРИХОД, РАСХОД, ЗАКАЗ) имеющие поля (ДАТА, НАИМЕНОВАНИЕ, КОЛИЧЕСТВО), где НАИМЕНОВАНИЕ это ссылка на справочник НАИМЕНОВАНИЙ.
Надо составить годовой помесячный отчёт по конкретному наименованию, где в столбцах будет (НАИМЕНОВАНИЕ, ЗАКАЗ, ПРИХОД, РАСХОД), а в строках сумма по КОЛИЧЕСТВУ по месяцам.
Что-то у меня не одной здоровой мысли не рождается. Попробывал так и эдак, но что-то всё не то
Заранее всем горомное спасибо!!!!!!!!!


 
Steven   (2002-09-13 08:12) [1]

select НАИМЕНОВАНИЕ, sum(Заказ), sum(Приход), sum(Расход)
from (

select НАИМЕНОВАНИЕ, КОЛИЧЕСТВО Заказ, 0 Приход, 0 Расход from ЗАКАЗ
union
select НАИМЕНОВАНИЕ, 0, КОЛИЧЕСТВО, 0 from ПРИХОД
union
select НАИМЕНОВАНИЕ, 0, 0, КОЛИЧЕСТВО from РАСХОД

) a
group by НАИМЕНОВАНИЕ


 
Slava_BAZ   (2002-09-13 08:38) [2]

Спасибо! Сейчас попробую.


 
ЮЮ ©   (2002-09-13 08:39) [3]

>Что-то у меня не одной здоровой мысли не рождается
Тогда будем следовать поэтамно, чтобы мысль уловил и дальше следовал также :-)


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 сервера !!!


 
ЮЮ ©   (2002-09-13 09:06) [4]

>Steven (13.09.02 08:12)

Тоже хорошо!!! А я всю мощь высшей математики бросил на решение школьного примера :-)


 
Slava_BAZ   (2002-09-13 09:26) [5]

>Steven (13.09.02 08:12)
Класно, но немного не то. У тебя получилось объединение 3 таблиц по полю НАИМЕНОВАНИЕ, а мне бы надо по конкретному наименованию за год с разбивкой по месяцам. Но всё равно спасибо, т.к. никакие знания никогда не пропадают даром!

ЮЮ © (13.09.02 08:39)
Спасибо! Сижу разбираюсь, но если всё это запихать в один запрос получить "дикая штучка", или лучше это сделать через хранимую процедуру???????


 
ЮЮ ©   (2002-09-13 09:40) [6]

хранимая процедура, чаще всего, нужна, если трудно получить что-то одни запросом, когда сканируются разные таблицы для получения результата. В данном случае у нас один запрос, возвращающий только то, что нам надо. Будет он записан в ХП, или отправлен на сервер с клиента - нет никакой разницы.

По поводу твоего замечания Steven. Он дал общее направление. Добавь туда
where НАИМЕНОВАНИЕ=:НАИМЕНОВАНИЕ and DATEPART(year,ДАТА)=:ГОД
выборку и группировку по DATEPART(month,ДАТА) и получишь то, что требуется


 
Johnmen ©   (2002-09-13 09:47) [7]

>ЮЮ © (13.09.02 08:39)

Ну скажем, высшая математика здесь непричем......:o)))
И меня очень интересует, а будет ли работать запрос вида
........
........
group by НАИМЕНОВАНИЕ,DATEPART(month,ДАТА) ?

Есть сильные сомнения...
Проверь ПРАКТИЧЕСКИ ! Если не сложно, сообщи о результатах...






 
Slava_BAZ   (2002-09-13 09:47) [8]

ЮЮ © (13.09.02 08:39)
Ещё раз огромное СПАСИБО! Надеюсь на поддержку в будущем, т.к. я ещё не волшебник, а только учусь.


 
ЮЮ ©   (2002-09-13 09:51) [9]

Johnmen © (13.09.02 09:47)
Проверил практически, работает :-)


 
Johnmen ©   (2002-09-13 10:04) [10]

>ЮЮ © (13.09.02 09:51)

Спасибо. Не думал я, что MS SQL в своем развитии так сильно отклонился от идеологии спецификации SQL92...


 
ЮЮ ©   (2002-09-13 10:09) [11]

2002 на дворе! Спецификации 1992 морально устарели :-)


 
Slava_BAZ   (2002-09-13 10:11) [12]

>Johnmen © (13.09.02 09:47)
У меня тоже получилось. Как говориться "А ларчик просто открывался" когда знаешь чем его открыть.



Страницы: 1 вся ветка

Текущий архив: 2002.10.03;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.015 c
1-8049
Карлсон
2002-09-22 15:05
2002.10.03
преобразование времени.


3-7827
Silenser
2002-09-10 12:23
2002.10.03
формат базы


1-8030
TopGun
2002-09-17 23:07
2002.10.03
Проблема с PChar


14-8112
Lamer86
2002-09-07 13:25
2002.10.03
Как сменить картинку при запуске Windows 98?


3-7882
Dmitriy Polskoy
2002-09-13 17:51
2002.10.03
DBGrid с возможностью сортировки