Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.10.03;
Скачать: [xml.tar.bz2];

Вниз

Отчёт из 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.006 c
1-7964
Link
2002-09-19 18:58
2002.10.03
Быстрый отчёт


14-8143
Карелин Артем
2002-08-30 16:11
2002.10.03
Встреча Мастаков в Самаре


3-7846
alexts
2002-09-11 12:57
2002.10.03
Фильтр в ADO


4-8231
Вадим
2002-08-18 21:34
2002.10.03
Always on top


6-8096
ODUVAN
2002-08-03 20:27
2002.10.03
Как получить все ссылки из HTML?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский