Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Сумма по полю для текущей записи  (Прочитано 42443 раз)
0 Пользователей и 5 Гостей смотрят эту тему.
Harry
Команда клуба

ua
Offline Offline

« : 31-03-2005 14:06 » new

Имеется: 2 таблицы People и Money связь по полю Sum как 1 ко многим (одному человеку принадлежит несколько выплат)
Нужно: Посчитать сумму по полю Sum таблицы Money для конкретного человека.
Запрос SELECT Sum(Money.Sum) FROM Money WHERE.....  какое написать условие? Если задать условие WHERE Money.PeopleCode=People.PeopleCode все равно получится сумма по ВСЕМ записям, а не по текущей. А как правильно?
Записан

Слабый пол силен в силу слабости сильного пола к слабому
Alf
Гость
« Ответ #1 : 31-03-2005 14:15 » 

Если мы хотим подсчитать все выплаты человека с кодом PeopleCode=N, то достаточно задать условие WHERE Money.PeopleCode=N, в данном примере вроде достаточно ограничиться одной таблицей Money.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 31-03-2005 15:26 » 

SELECT Sum(Money.Sum) FROM Money WHERE...
group by PeopleCode
« Последнее редактирование: 31-03-2005 15:28 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Harry
Команда клуба

ua
Offline Offline

« Ответ #3 : 01-04-2005 08:26 » 

Если мы хотим подсчитать все выплаты человека с кодом PeopleCode=N, то достаточно задать условие WHERE Money.PeopleCode=N, в данном примере вроде достаточно ограничиться одной таблицей Money.

Это если бы известен был конкретный код. Идея такая - мы листаем справочник People и заходя в карточку любого клиента видим сумму выплат именно по нему. Но как реализовать такой запрос, типа конструкции WHERE People.PeopleCode=Money.CurrentRecord.PeopleCode ? Ведь понятия текущей записи нет в запросах? Или есть?
Записан

Слабый пол силен в силу слабости сильного пола к слабому
Harry
Команда клуба

ua
Offline Offline

« Ответ #4 : 01-04-2005 08:31 » 

SELECT Sum(Money.Sum) FROM Money WHERE...
group by PeopleCode

Тогда я получу суммы ВСЕХ плательщиков, сгруппированные по коду. А мне нужен один, как бы фильтр по коду...
Записан

Слабый пол силен в силу слабости сильного пола к слабому
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 01-04-2005 08:42 » 

Т.е. ты хочешь получить что-то типа:
Код:
peopleCode1  Sum1
                    Sum2
                    Sum3
peopleCode2  Sum1
                    Sum2
                    Sum3
?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 01-04-2005 08:47 » 

Если это так, то надо раскручивать курсор по PeopleCode
выбираешь пиплов, а потом для каждого пипла выбираешь выплаты
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Alf
Гость
« Ответ #7 : 01-04-2005 08:48 » 

Это если бы известен был конкретный код. Идея такая - мы листаем справочник People и заходя в карточку любого клиента видим сумму выплат именно по нему. Но как реализовать такой запрос, типа конструкции WHERE People.PeopleCode=Money.CurrentRecord.PeopleCode ?

А можно тогда поглядеть пример, как бы это должно было выглядеть? Что имеем на входе и что хотим получить в результате?

Ведь понятия текущей записи нет в запросах? Или есть?

Вообще-то реляционное счисление манипулирует отношениями целиком, не разделяя на отдельные кортежи. Но при желании можно работать с процедурной частью SQL, там есть понятие курсора, с помощью которого можно перебирать строки по одной. Однако это не совсем корректно, такие приемы нужно в самом крайнем случае использовать.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 01-04-2005 08:56 » 

Но здесь еще надо знать для каких целей это надо знать
 - только  бумажная копию выборки - тогда это можно организовать форматированием запроса,
 - получить результат для дольнейшего преобразовния - как правильно заметил Alf - курсор
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Falsehood
Молодой специалист

ru
Offline Offline
Пол: Женский
не может быть


« Ответ #9 : 01-04-2005 10:18 » 

попробовала в FoxPro 6.0
Код:
select PeopleCode, sum(Sum) from Money where Money.PeopleCode = People.PeopleCode into cursor Qqq
выбирается одна строчка с суммой выплат по тому человеку, на котором в данный момент стоит курсор в таблице People. или требуется что-то другое?
Записан

Славная трава...
Harry
Команда клуба

ua
Offline Offline

« Ответ #10 : 01-04-2005 13:36 » 

Расшифрую задачу.
Есть организация, члены которой платят членские взносы. Список членов - в виде таблицы People.
Взносы могут платиться нерегулярно, кем то больше, кем то меньше, кто-то их может совсем не заплатить.
Т.е. хочется, идя курсором по табличке списка людей зайти в форму конкретного человека, в которой на одной из вкладок тоже есть табличка - именно ЕГО выплат. А отдельно - сумма этих выплат.
Выплаты сделаны отдельной таблицей Money, подчиненной таблице People.
Так вот, как раз реализовано все, кроме итоговой суммы выплат по человеку.

P.S. Программа пишется в Delphi, но, думаю, корректней этот вопрос все же задавать в форуме БД Улыбаюсь Сами таблицы - Парадоксовские.
Записан

Слабый пол силен в силу слабости сильного пола к слабому
Alf
Гость
« Ответ #11 : 01-04-2005 13:55 » 

Все же непонятно, в какой именно момент производится расчет взносов.

1. Заранее строится таблица вида "Человек - Сумма", и при проходе по списку людей оттуда берутся данные.

2. При переходе на строку с данными некоторого человека выполняется запрос, который подсчитывает только его платежи. Делается это каждый раз при переходе на новую строку.

Какой из вариантов лучше подходит?
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 01-04-2005 13:56 » 

SELECT PeopleCode КодПипла from People WHERE
все пиплы

SELECT Money.Sum FROM Money WHERE Money.PeopleCode= :КодПипла
все взносы пипла

SELECT Sum(Money.Sum) FROM Money WHERE Money.PeopleCode= :КодПипла

Это и будет вся сумма по пиплу, КодПипла ты знаешь

В чем трудность?

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Harry
Команда клуба

ua
Offline Offline

« Ответ #13 : 04-04-2005 07:19 » 

SELECT PeopleCode КодПипла from People WHERE
все пиплы

SELECT Money.Sum FROM Money WHERE Money.PeopleCode= :КодПипла
все взносы пипла

SELECT Sum(Money.Sum) FROM Money WHERE Money.PeopleCode= :КодПипла

Это и будет вся сумма по пиплу, КодПипла ты знаешь

В чем трудность?



Не знаю я код. Мне нужно выбрать взносы по текущему пиплу, в карточку которого я вошел. Т.е. привязать запрос к конкретному коду нельзя.
Записан

Слабый пол силен в силу слабости сильного пола к слабому
Harry
Команда клуба

ua
Offline Offline

« Ответ #14 : 04-04-2005 07:21 » 

Все же непонятно, в какой именно момент производится расчет взносов.

1. Заранее строится таблица вида "Человек - Сумма", и при проходе по списку людей оттуда берутся данные.

2. При переходе на строку с данными некоторого человека выполняется запрос, который подсчитывает только его платежи. Делается это каждый раз при переходе на новую строку.

Какой из вариантов лучше подходит?
Первый вариант.
Записан

Слабый пол силен в силу слабости сильного пола к слабому
Югг
Гость
« Ответ #15 : 04-04-2005 09:04 » 

А я бы в момент выбора человека (в этот момент ты уже знаешь его код) просто выполняла запрос


SELECT Money.Sum FROM Money WHERE Money.PeopleCode= :КодПипла
все взносы пипла


и все.
Записан
Alf
Гость
« Ответ #16 : 04-04-2005 09:20 » 

Первый вариант.

Тогда вполне корректно
Код:
SELECT PeopleCode, SUM(Sum)
FROM Money
GROUP BY PeopleCode

Этот запрос вернет таблицу вида "КодПерсоны - СуммаПлатежей", которой можно впоследствии воспользоваться для отображения.

Единственное замечание - называть столбцы таблицы именами встроенных функций и зарезервированными словами явно не лучшее решение (это я по поводу столбца Money.Sum). Лучше переименовать во что-то нейтральное типа Payment etc.
Записан
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #17 : 04-04-2005 09:46 » 

а если попробовать так, используюя такой запрос:

Код:
SELECT
  People.*
  Vznosy.SummaVznosov
FROM
  People
INNER JOIN
  (SELECT
      PeopleCode,
      SUM(Money.Sum) AS [SummaVznosov]
   FROM
      Money
   GROUP BY
     PeopleCode) AS Vznosy ON Vznosy.PeopleCode = People.PeopleCode

в парадоксе не силен, но INNER JOIN, вроде относится к стандарту SQL и должно все отработать
Записан

I Have Nine Lives You Have One Only
THINK!
Harry
Команда клуба

ua
Offline Offline

« Ответ #18 : 04-04-2005 11:06 » 

Тогда вполне корректно
Код:
SELECT PeopleCode, SUM(Sum)
FROM Money
GROUP BY PeopleCode

Этот запрос вернет таблицу вида "КодПерсоны - СуммаПлатежей", которой можно впоследствии воспользоваться для отображения.

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

HandKot: идею понял, но что-то не работает. Попытаюсь еще помучать код, не может быть, чтобы Парадокс не понимал вложенных запросов...
« Последнее редактирование: 04-04-2005 11:10 от Harry » Записан

Слабый пол силен в силу слабости сильного пола к слабому
Alf
Гость
« Ответ #19 : 04-04-2005 11:17 » 

Все же непонятно, в какой именно момент производится расчет взносов.

1. Заранее строится таблица вида "Человек - Сумма", и при проходе по списку людей оттуда берутся данные.

2. При переходе на строку с данными некоторого человека выполняется запрос, который подсчитывает только его платежи. Делается это каждый раз при переходе на новую строку.

Какой из вариантов лучше подходит?
Первый вариант.
Тогда вполне корректно
Код:
SELECT PeopleCode, SUM(Sum)
FROM Money
GROUP BY PeopleCode

Этот запрос вернет таблицу вида "КодПерсоны - СуммаПлатежей", которой можно впоследствии воспользоваться для отображения.

Вот именно, таблицу. А нужно единственное значение для текущего пипла.

Или я чего-то не понимаю, или...

Из первого ответа явственно следует, что наилучшим образом подходит вариант с таблицей. Из второго - не менее явственно, что таблица никак не годится. На такую пару вопросов прямо затрудняюсь дать ответ. И сомневаюсь, что кто-нибудь справится.
Записан
Falsehood
Молодой специалист

ru
Offline Offline
Пол: Женский
не может быть


« Ответ #20 : 04-04-2005 13:22 » 

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

в условии where явно укажи псевдоним таблицы, из которой берется код человека для выбора взносов :
Код:
select PeopleCode, sum(Sum) from Money where Money.PeopleCode = People.PeopleCode group by PeopleCode into cursor Qqq

или предварительно запомни его в переменную :
Код:
lcPeopleCodу = People.PeopleCode
select PeopleCode, sum(Sum) from Money where Money.PeopleCode = lcPeopleCode group by PeopleCode into cursor Qqq
Записан

Славная трава...
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #21 : 04-04-2005 14:14 » 

в условии where явно укажи псевдоним таблицы, из которой берется код человека для выбора взносов :
Код:
select PeopleCode, sum(Sum) from Money where Money.PeopleCode = People.PeopleCode group by PeopleCode into cursor Qqq
этот запрос работать не будет
А запомнить код пипла я уже предлагал
SELECT PeopleCode КодПипла from People WHERE ...
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Falsehood
Молодой специалист

ru
Offline Offline
Пол: Женский
не может быть


« Ответ #22 : 04-04-2005 15:35 » 

Sla, почему не будет работать? в FoxPro 6.0 работает, а в Парадоксе не сработет?
Записан

Славная трава...
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #23 : 04-04-2005 15:49 » 

потому что fox это не SQL, в Парадоксе может и сработает
Oracle? MsSql? MySql? работать не будет
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #24 : 05-04-2005 05:22 » 

Harry 
может тебе подойдет такой вариант (хотя мож он и проскакивал уже в теме)

Код:
SELECT
  People.*,
  (SELECT SUM(Sum) FROM Money WHERE Money.PeopleCode = People.PeopleCode) AS [Взносы]
FROM
  People

Записан

I Have Nine Lives You Have One Only
THINK!
Harry
Команда клуба

ua
Offline Offline

« Ответ #25 : 05-04-2005 06:38 » 

Или я чего-то не понимаю, или...

Из первого ответа явственно следует, что наилучшим образом подходит вариант с таблицей. Из второго - не менее явственно, что таблица никак не годится. На такую пару вопросов прямо затрудняюсь дать ответ. И сомневаюсь, что кто-нибудь справится.

Наверное, я некорректно сформулировал задачу. Имелось в виду, что при выборе в таблице людей конкретного человека мы переходим в форму. В форме лежит таблица взносов уже по этому, конкретному человеку. И сумма по нему же. Вот сумма-то и не получается... Улыбаюсь
Записан

Слабый пол силен в силу слабости сильного пола к слабому
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #26 : 05-04-2005 06:43 » 

В форме лежит таблица взносов уже по этому, конкретному человеку. И сумма по нему же. Вот сумма-то и не получается... Улыбаюсь
чтобы получить таблицу взносов конкретного пипла, тебе нужно знать код этого пипла, а зная код ты получишь сумму.
или я чего-то не понимаю
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Harry
Команда клуба

ua
Offline Offline

« Ответ #27 : 05-04-2005 07:38 » 

Да, но код я и не знаю. Я ведь не могу знать, какого пипла я буду выбирать. Так что код жестко привязывать не могу. Вариантов, похоже, тут два. Один - повесить на кнопку входа в форму запрос на получение кода, второй - последний вариант, который предложил HandKot. В той вариации, что он написал, запрос дает ПЕРВУЮ запись. Но уже по конкретному пиплу. Истина где-то рядом, сижу, ищу... Улыбаюсь
Записан

Слабый пол силен в силу слабости сильного пола к слабому
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #28 : 05-04-2005 07:45 » 

Погодь!
У тебя две формы.
Первая - это пиплы
Вторая - это взносы конкретного пипла.
Как эти две формы связаны друг с другом?
запрос HandKot даст суммы взносов каждого пипла
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Alf
Гость
« Ответ #29 : 05-04-2005 08:09 » 

Наверное, я некорректно сформулировал задачу. Имелось в виду, что при выборе в таблице людей конкретного человека мы переходим в форму. В форме лежит таблица взносов уже по этому, конкретному человеку. И сумма по нему же. Вот сумма-то и не получается... Улыбаюсь

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

Здесь возможны два решения.

Первое - динамически формировать строку запроса SQL во время выполнения программы, поскольку это - всего лишь текстовая строка, и она не компилируется с программой, а интерпретируется сервером баз данных непосредственно во время выполнения. Так, если код текущей персоны CurrPersonId, то формируется строка вида:
Код:
strSQL = "SELECT SUM(Sum) FROM Money WHERE (PersonId = " + CurrPersonId.ToString() + ")"
а потом этот запрос выполняется.

Второе решение - использовать параметризованный запрос, который ведет себя подобно процедуре с формальными параметрами. Тогда во время выполнения запроса нужно сообщить значение его фактического аргумента. В статьях по ADO.NET я приводил пример, как это сделать на данной платформе. На других платформах есть аналогичные средства.
Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines