Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Выборка из 3-х таблиц / 13 сообщений из 13, страница 1 из 1
18.01.2011, 16:03
    #37064901
Jakudza
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из 3-х таблиц
Есть 3 таблицы:
------------------
1. Поступления
PgKvsPpl199110500100199110520121101430100500103190600245

2. План
PgKvsPpl119110500100019911052012101014310050001031906002450

3. Группа товаров
KgvKvs1287110500128711052012513400007564301007564302001024190600

Pg - код подразделения
Kvs - код вида товара
Ppl - стоимость
Kgv - код группы товаров

Нужно получить суммы поступлений и планов по группам следующего вида:
KgvPgSum_PlanSum_Post12871992210221756101500050010241032450245
...
Рейтинг: 0 / 0
18.01.2011, 16:14
    #37064937
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из 3-х таблиц
Стандартный запрос с группировкой. В чем проблема?
...
Рейтинг: 0 / 0
18.01.2011, 17:45
    #37065187
Jakudza
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из 3-х таблиц
Dima T,

SELECT b65.kgv,b01.pg,SUM(b01.ppl/1000),SuM(b05.Znm12/1000) FROM b5200065 as b65
INNER JOIN b520001 as b01 ON (b65.kvs=b01.kvs)
INNER JOIN b520005 as b05 ON (b65.kvs=b05.kvs)
GROUP BY b65.ng,b65.kgv,b01.pg

----------------
b65 - группа товаров
b01 - поступления
b05 - планы

Да потому что бред получается, не те суммы, если убрать один из джоинов, то сумма получается верной, а вот вместе ни как не хотят дружить :(
В одной из таблиц, b01, или b05, может быть так что нет соответствий. Например: в b05 есть план по коду 110500, а в b01 нет поступлений по данному виду.

На приведенных выше данных этот запрос отрабатывает нормально, но вот на реальных таблицах дает не те суммы.
...
Рейтинг: 0 / 0
18.01.2011, 17:52
    #37065208
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из 3-х таблиц
Jakudza,

в форум по mysql. За последние 3 дня уже 3 или 4 темы было.
...
Рейтинг: 0 / 0
19.01.2011, 06:57
    #37065848
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из 3-х таблиц
Не вник сразу, не совсем стандартный, но не особо сложный. Надо подзапрос.
Если сделать допущение что в поступлениях может быть только то что есть в плане, то так:
Код: plaintext
1.
2.
3.
4.
5.
6.
select Tov.Kvg, A.Pg, sum(A.SumPlan) as SumPlan, sum(A.SumPost) as SumPost;
   from Tov inner join 
           (select Plan.Pg, Plan.Kvs, sum(Plan.Ppl) as SumPlan, sum(Post.Ppl) as SumPost;
            from Plan left join Post on Plan.Pg = Post.Pg and Plan.Kvs = Post.Kvs;
             group by Plan.Pg, Plan.Kvs) as A;
                 on Tov.Kvs = A.Kvs;
   group by Tov.Kvg, A.Pg
Если в поступлениях не только то что в плане, то left join заменить на full join и Plan.Pg на nvl(Plan.Pg, Post.Pg), аналогично с Kvs
...
Рейтинг: 0 / 0
19.01.2011, 10:48
    #37066104
Jakudza
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из 3-х таблиц
Разобрался сам.
Т.к. в планах сумма по виду может встречается только один раз, а в поступлениях сколько угодно, то соответственно ее суммировать нет необходимости.
В итоге получаем:
Код: plaintext
1.
2.
3.
SELECT b65.kgv,b01.pg,SUM(b01.ppl/ 1000 ),b05.Znm12/ 1000  FROM b5200065 as b65
INNER JOIN b520001 as b01 ON (b65.kvs=b01.kvs)
INNER JOIN b520005 as b05 ON (b65.kvs=b05.kvs)
GROUP BY b65.ng,b65.kgv,b01.pg

Всем огромное спасибо за помощь!
...
Рейтинг: 0 / 0
19.01.2011, 10:50
    #37066109
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из 3-х таблиц
Вы сделали стандартную ошибку в понимании того, что есть Join. Вы считаете, что и первый, и второй Join "присоединяются" к первой таблице. А на самом деле это не так. Можно сказать, что второй Join "присоединяется" к результату объединения первых двух таблиц.

Как следствие, созданный Вами запрос будет корректно работать только и исключительно в том случае, если связь между таблицами вида один-к-одному. Если связь вида один-ко-многим, то произойдет "умножение" результата суммирования.

Отсюда очевидный вывод заключается в том, что необходимо отдельно просуммировать данные по таблице поступлений и отдельно по таблице плана. И только третьим запросом объединять эти данные.

Запрос Dima_T будет корректно работать только в случае, если хотя бы в одной из таблиц "план" или "поступления" на каждую пару pg и kvs есть только одна запись. Т.е. связь между этими таблицами вида один-ко-многим или много-к-одному. Если же связь между этими таблицами вида много-ко-многим, то этот запрос опять покажет не корректное значение.

Другими словами, в самом общем случае, необходим запрос вида

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
* Суммирование плана
select b65.Kvg, b01.pg, SUM(b01.ppl/ 1000 ) as sumPPL ;
into cursor curPlan nofilter ;
from b520001 as b01 ;
inner join b5200065 as b65 on b01.kvs = b65.kvs
group by b65.Kvg, b01.pg

* Суммирование факта
select b65.Kvg, b05.pg, SUM(b05.Znm12/ 1000 ) as sumZNM ;
into cursor curFact nofilter ;
from b520005 as b05 ;
inner join b5200065 as b65 on b05.kvs = b65.kvs
group by b65.Kvg, b05.pg

* Объединение плана и факта 
select nvl(curPlan.kvg, curFact.kvg) as kvg , nvl(curPlan.pg, curFact.pg) as pg, curPlan.sumPPL, curFact.sumZNM 
from curPlan 
full join curFact on curPlan.pg = curFact.pg and curPlan.kvg = curFact.kvg

Если есть желание, можно попытаться реализовать это все в одном запросе с подзапросами. Но общая идея именно такая: отдельные запросы по плану и факту и последующее их объединение.
...
Рейтинг: 0 / 0
19.01.2011, 13:06
    #37066563
Ну3.14ц
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из 3-х таблиц
егавторВы сделали стандартную ошибку в понимании того, что есть Join. Вы считаете, что и первый, и второй Join "присоединяются" к первой таблице. А на самом деле это не так. Можно сказать, что второй Join "присоединяется" к результату объединения первых двух таблиц.

Как следствие, созданный Вами запрос будет корректно работать только и исключительно в том случае, если связь между таблицами вида один-к-одному. Если связь вида один-ко-многим, то произойдет "умножение" результата суммирования.

Отсюда очевидный вывод заключается в том, что необходимо отдельно просуммировать данные по таблице поступлений и отдельно по таблице плана. И только третьим запросом объединять эти данные.

Запрос Dima_T будет корректно работать только в случае, если хотя бы в одной из таблиц "план" или "поступления" на каждую пару pg и kvs есть только одна запись. Т.е. связь между этими таблицами вида один-ко-многим или много-к-одному. Если же связь между этими таблицами вида много-ко-многим, то этот запрос опять покажет не корректное значение.

Другими словами, в самом общем случае, необходим запрос вида

Это ты в какой фантастическойкнеге вычитал ?
...
Рейтинг: 0 / 0
19.01.2011, 13:24
    #37066624
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из 3-х таблиц
Ну3.14цЭто ты в какой фантастическойкнеге вычитал ?
А тебе чего тут не понравилось? Троль?

Владимир прав, я с оптимизацией немного перестарался, мой запрос работает если ВладимирМхотя бы в одной из таблиц "план" или "поступления" на каждую пару pg и kvs есть только одна запись
тут только ошибочка не в "хотя бы в одной", а в обоих, поэтому предварительно нужна группировка как в примере от Владимира.
...
Рейтинг: 0 / 0
19.01.2011, 17:20
    #37067403
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из 3-х таблиц
Dima TНу3.14цЭто ты в какой фантастическойкнеге вычитал ?
А тебе чего тут не понравилось? Троль?Бери выше, это прошёлмимо.
...
Рейтинг: 0 / 0
19.01.2011, 17:39
    #37067473
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из 3-х таблиц
tanglirDima Tпропущено...

А тебе чего тут не понравилось? Троль?Бери выше, это прошёлмимо.

ты, меня сученок, - спутал.

я никогда не перелогиниваюсь и пишу всегда только под своим ником.
...
Рейтинг: 0 / 0
19.01.2011, 18:21
    #37067590
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из 3-х таблиц
>ты, меня сученок, - спутал.
Что такое "сученок"? Если хотел меня оскорбить - то бегом учить русский язык! По-падонкафски я оскорбляюсь только в ПТ!

>я никогда не перелогиниваюсь и пишу всегда только под своим ником.
Таки да? Ну лан, теперь буду в курсе - у тебя ж в автоподписи этого нет :) Кстати, я тоже.

ЗЫ. На "выше троля" обиделся что ль?
...
Рейтинг: 0 / 0
19.01.2011, 18:35
    #37067630
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка из 3-х таблиц
tanglir>ты, меня сученок, - спутал.
Что такое "сученок"? Если хотел меня оскорбить - то бегом учить русский язык! По-падонкафски я оскорбляюсь только в ПТ!

>я никогда не перелогиниваюсь и пишу всегда только под своим ником.
Таки да? Ну лан, теперь буду в курсе - у тебя ж в автоподписи этого нет :) Кстати, я тоже.

ЗЫ. На "выше троля" обиделся что ль?

иди пести в ПТ - там ты спец.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Выборка из 3-х таблиц / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]