Форум: "Базы";
Текущий архив: 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