:: Visual Foxpro, Foxpro for DOS
sum и inner в запросе
ama68
Автор

Сообщений: 5278
Откуда: Кострома
Дата регистрации: 27.04.2006
Здравствуйте!

Завис насмерть! Видимо, старею.

есть 3 таблицы:

Create Cursor tmpData (cRec C (1), nYear N (4, 0))
Insert Into tmpData (cRec, nYear) Value ('a', 2018)
Insert Into tmpData (cRec, nYear) Value ('b', 2018)
Insert Into tmpData (cRec, nYear) Value ('c', 2019)
Insert Into tmpData (cRec, nYear) Value ('d', 2019)
Insert Into tmpData (cRec, nYear) Value ('e', 2018)
Insert Into tmpData (cRec, nYear) Value ('f', 2020)
Create Cursor tmpData_1 (cRec_D1 C (1), cRec N (2, 0))
Insert Into tmpData_1 (cRec_D1, cRec) Value ('a', 21)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('a', 22)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('a', 23)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('c', 25)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('c', 21)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('c', 27)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('c', 28)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('d', 29)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('d', 30)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('d', 31)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('y', 32)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('y', 33)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('i', 34)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('i', 35)
Create Cursor tmpData_2 (cRec_D2 N (2, 0), nSumma N (6, 2))
Insert Into tmpData_2 (cRec_D2, nSumma) Value (21, 200)
Insert Into tmpData_2 (cRec_D2, nSumma) Value (21, 600)
Insert Into tmpData_2 (cRec_D2, nSumma) Value (31, 400)
Insert Into tmpData_2 (cRec_D2, nSumma) Value (21, 300)
Insert Into tmpData_2 (cRec_D2, nSumma) Value (21, 800)
Insert Into tmpData_2 (cRec_D2, nSumma) Value (21, 600)
Insert Into tmpData_2 (cRec_D2, nSumma) Value (31, 800)
Insert Into tmpData_2 (cRec_D2, nSumma) Value (21, 1200)
Insert Into tmpData_2 (cRec_D2, nSumma) Value (25, 1100)
Insert Into tmpData_2 (cRec_D2, nSumma) Value (25, 1500)
Insert Into tmpData_2 (cRec_D2, nSumma) Value (22, 1600)
Insert Into tmpData_2 (cRec_D2, nSumma) Value (22, 2400)
Insert Into tmpData_2 (cRec_D2, nSumma) Value (30, 3300)
Insert Into tmpData_2 (cRec_D2, nSumma) Value (30, 2400)
Insert Into tmpData_2 (cRec_D2, nSumma) Value (30, 3600)
Insert Into tmpData_2 (cRec_D2, nSumma) Value (11, 8800)
Insert Into tmpData_2 (cRec_D2, nSumma) Value (21, 1200)
Insert Into tmpData_2 (cRec_D2, nSumma) Value (22, 1100)

Нужно сделать выборку tmpData_2.nSumma и просуммировать, где:
tmpData_1.cRec_D1 = tmpData.cRec And (tmpData.nYear = 2018 Or tmpData.nYear = 2019)
tmpData_2.cRec_D2 = tmpData_1.cRec And tmpData_2.cRec_D2 = 21

Чтобы получить результат:

nYear nSumma
2018 2500
2019 1200

На худой конец:

nYear nSumma
2018 200
2018 600
2018 300
2018 800
2018 600
2019 1200

все мозги уже вспотели!



Исправлено 1 раз(а). Последнее : ama68, 21.08.20 19:14
Ratings: 0 negative/0 positive
Re: sum и inner в запросе
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Какие люди!

Из:
tmpData_1.cRec_D1 = tmpData.cRec And (tmpData.nYear = 2018 Or tmpData.nYear = 2019)
tmpData_2.cRec_D2 = tmpData_1.cRec And tmpData_2.cRec_D2 = 21

есть:
соединение таблиц: tmpData_1.cRec_D1 = tmpData.cRec And tmpData_2.cRec_D2 = tmpData_1.cRec
фильтр: (tmpData.nYear = 2018 Or tmpData.nYear = 2019) And tmpData_2.cRec_D2 = 21

осталось
группировку: GROUP BY tmpData.nYear
выражение суммы: SUM(tmpData_2.nSumma)

SELECT tmpData.nYear, SUM(tmpData_2.nSumma);
FROM tmpData, tmpData_1, tmpData_2;
WHERE соединение AND фильтр;
GROUP BY группировка;
ORDER BY группировка

С inner надо тоже самое, но в WHERE соединение перенести в INNER JOIN...
Ratings: 0 negative/0 positive
Re: sum и inner в запросе
Владимир Максимов

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
Задача не имеет решения, поскольку связь не однозначная приведена

2018 - a - 21
2019 - c - 21

Т.е. и от 2018 года выходим на код 21 и от 2019 года также выходим на код 21. В результате, в обоих случаях получим одну и ту же сумму. Без каких-то дополнительных ограничений задачу не решить

Насколько я понимаю, тут все завязано на порядок следования записей. Но опять же, а в какой момент остановиться? Т.е. вот первые 5 записей с кодом 21 - это 2018 год, а 6-ая запись с кодом 21 - это 2019 год? И почему не надо учитывать 7-ую запись с кодом 21? Почему, собственно? Из приведенных данных это никак не следует
Ratings: 0 negative/1 positive
Re: sum и inner в запросе
ama68
Автор

Сообщений: 5278
Откуда: Кострома
Дата регистрации: 27.04.2006
Кабы так просто было...
Постоянно выдаёт одно и то же:

2018 4900
2019 4900

Это если использовать SUM

А если не использовать, всё-равно на результат нужный не выхожу

Запрос такой:

Select tmpData.nYear, Sum (tmpData_2.nSumma) As nSumma ;
From tmpData ;
Inner Join tmpData_1 On tmpData_1.cRec_D1 = tmpData.cRec And tmpData_1.cRec = 21;
Inner Join tmpData_2 On tmpData_2.cRec_D2 = tmpData_1.cRec;
Where ;
(tmpData.nYear = 2018 Or tmpData.nYear = 2019);
Group By 1 ;
InTo Cursor tmpSum
Ratings: 0 negative/0 positive
Re: sum и inner в запросе
ama68
Автор

Сообщений: 5278
Откуда: Кострома
Дата регистрации: 27.04.2006
Скажем так:

cRec (значение 'a') - ID записи таблицы tmpData
cRec (значение 21) - ID записи таблицы tmpData_1
cRec_D2 (значение 21) - поле связи таблицы tmpData_2 с таблицей tmpData_1

Получается двухступенчатая связь:

tmpData -> tmpData_1 как tmpData_1.cRec_D1 = tmpData.cRec
tmpData_1 -> tmpData_2 как tmpData_2.cRec_D2 = tmpData_1.cRec
Ratings: 0 negative/0 positive
Re: sum и inner в запросе
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Владимир же написал - у тебя по первой связи получается что подходят записи
('a', 21)
('c', 21)
по второй связи к КАЖДОЙ из них подходят ВСЕ записи с cRec_D2=21
естественно результат и должен быть абсолютно одинаковым.

Вот если бы по первой связи подходили записи
('a', 21)
('c', 25)
то и суммы были бы разные - одна по всем 21-м и другая по всем 25-м.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: sum и inner в запросе
ama68
Автор

Сообщений: 5278
Откуда: Кострома
Дата регистрации: 27.04.2006
Я всё понял: необходима была связь таблиц tmpData_2.cRec_D и tmpData.cRec

Вот так решение есть:

Create Cursor tmpData (cRec C (1), nYear N (4, 0))
Insert Into tmpData (cRec, nYear) Value ('a', 2018)
Insert Into tmpData (cRec, nYear) Value ('b', 2018)
Insert Into tmpData (cRec, nYear) Value ('c', 2019)
Insert Into tmpData (cRec, nYear) Value ('d', 2019)
Insert Into tmpData (cRec, nYear) Value ('e', 2018)
Insert Into tmpData (cRec, nYear) Value ('f', 2020)
Create Cursor tmpData_1 (cRec_D1 C (1), cRec N (2, 0))
Insert Into tmpData_1 (cRec_D1, cRec) Value ('a', 21)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('a', 22)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('a', 23)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('c', 25)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('c', 21)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('c', 27)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('c', 28)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('d', 29)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('d', 30)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('d', 31)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('y', 32)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('y', 33)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('i', 34)
Insert Into tmpData_1 (cRec_D1, cRec) Value ('i', 35)
Create Cursor tmpData_2 (cRec_D c (1), cRec_D2 N (2, 0), nSumma N (6, 2))
Insert Into tmpData_2 (cRec_D, cRec_D2, nSumma) Value ('a', 21, 200)
Insert Into tmpData_2 (cRec_D, cRec_D2, nSumma) Value ('a', 21, 600)
Insert Into tmpData_2 (cRec_D, cRec_D2, nSumma) Value ('d', 31, 400)
Insert Into tmpData_2 (cRec_D, cRec_D2, nSumma) Value ('a', 21, 300)
Insert Into tmpData_2 (cRec_D, cRec_D2, nSumma) Value ('a', 21, 800)
Insert Into tmpData_2 (cRec_D, cRec_D2, nSumma) Value ('a', 21, 600)
Insert Into tmpData_2 (cRec_D, cRec_D2, nSumma) Value ('d', 31, 800)
Insert Into tmpData_2 (cRec_D, cRec_D2, nSumma) Value ('d', 21, 1200)
Insert Into tmpData_2 (cRec_D, cRec_D2, nSumma) Value ('c', 25, 1100)
Insert Into tmpData_2 (cRec_D, cRec_D2, nSumma) Value ('c', 25, 1500)
Insert Into tmpData_2 (cRec_D, cRec_D2, nSumma) Value ('a', 22, 1600)
Insert Into tmpData_2 (cRec_D, cRec_D2, nSumma) Value ('a', 22, 2400)
Insert Into tmpData_2 (cRec_D, cRec_D2, nSumma) Value ('d', 30, 3300)
Insert Into tmpData_2 (cRec_D, cRec_D2, nSumma) Value ('d', 30, 2400)
Insert Into tmpData_2 (cRec_D, cRec_D2, nSumma) Value ('f', 30, 3600)
Insert Into tmpData_2 (cRec_D, cRec_D2, nSumma) Value ('d', 29, 8800)
Insert Into tmpData_2 (cRec_D, cRec_D2, nSumma) Value ('c', 21, 1200)
Insert Into tmpData_2 (cRec_D, cRec_D2, nSumma) Value ('a', 22, 1100)
Select tmpData.nYear, sum (tmpData_2.nSumma) As nSumma ;
From tmpData ;
Inner Join tmpData_1 On tmpData_1.cRec_D1 = tmpData.cRec;
Inner Join tmpData_2 On tmpData_2.cRec_D2 = tmpData_1.cRec And ;
tmpData_2.cRec_D = tmpData.cRec And ;
tmpData_2.cRec_D2 = 21;
Where ;
(tmpData.nYear = 2018 Or tmpData.nYear = 2019);
Group By 1;
InTo Cursor tmpSum

Всем огромное спасибо!
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 31 (Гостей: 31)

© 2000-2024 Fox Club 
Яндекс.Метрика