Вопрос № 36655: Здравствуйте Уважаемые!
Работаю с БД на MSSQL Server 2000.
Неподскажете ли возможность в группировке
выбрать значение столбца в последней строке.
Поясню.Создаю запрос вида.
SELECT lgota_id, Fio, SUM(rasxod)
FROM People
GR...
Вопрос № 36.655
Здравствуйте Уважаемые!
Работаю с БД на MSSQL Server 2000.
Неподскажете ли возможность в группировке
выбрать значение столбца в последней строке.
Поясню.Создаю запрос вида.
SELECT lgota_id, Fio, SUM(rasxod)
FROM People
GROUP BY lgota_id,Fio
В результате получается к примеру:
13 Первый 50
25 Первый 75
В выборке конечно много строк с разными
Fio две я просто привел для примера.
Из группировки надо исключить lgota_id,
но это поле д.б. в выборке и этому полю д.б.
присвоено последнее значение в данном
случае 25 т.е. должно получиться
25 Первый 125
Я придумал пока только запрос такой
SELECT MAX(lgota_id), Fio, SUM(rasxod)
FROM People
GROUP BY Fio
Однако в данном случае это будет верно,
но может быть вариант когда lgota_id=20 и 12
и тогда будет выбрано значение 20 а надо бы 12.
Также неподходит и агрегатная функция MIN
часть выборок будет правильная а часть нет
как и с MAX.Надеюсь обьяснил понятно,какие
могут быть предложения по простой реализации
этого запроса SQL или это невозможно.
Спасибо.
Александр.
Чечтно говоря я не понял сути,
а так помогу,
мыло: ruf@inbox.ru
Ответ отправил: Nrr (статус: 1-ый класс)
Отправлен: 03.03.2006, 16:55
Отвечает: Архангельский Андрей Германович
Здравствуйте, Трофименко А.В.!
1) Вообще то есть такое понятие как нормализация БД, свалить все в одну кучу, а потом пытаться сделать выборку не самый лучший способ. По эдной табличке задачу не видно.
2) В БД нет понятия первая/последня строка. Как определить какую льготу нужно выбирать - должен быть соответствующий признак для поля lgota_id, если ты сформируешь такой признак, то по нему можно применить MAX/MIN
Ответ отправил: Архангельский Андрей Германович (статус: Практикант)
Отправлен: 03.03.2006, 17:02 Оценка за ответ: 3 Комментарий оценки: Спасибо за теорию,но в реальности иногда приходится работать с тем,что есть. Я и задавал вопрос с целью получить предложения как это сделать с минимумом затрат непеределывая тех программ которые есть (вернее внести минимальные изменения,причем программы не мои).А в данном случае здесь практически три программы.Выборка из одной программы,обрабатывает эту выборку вторая программа
и результат передается третьей.Недавно эта связка работала,но создатели внесли изменения в первую и все суммы полетели.Конечно как говорит один из моих начальников можно это и на листочке посчитать и вручную перенести например,но мне от этого смешно и грустно и по собственной инициативе хотелось бы автоматизировать процесс.Конечно в БД нет понятия первая и последняя,но при добавлении записей в таблицу как правило последние записи соответствуют
последним изменениям,ну или в этом случае так.Можно добавить identity-столбец,но как присвоить lgota_id=значение lgota_id в строке у которой MAX(identity) и причем MAX(identity) выбирается не из всех строк таблицы а из тех у которых одинаковые Fio,группировка по Fio должна соблюдаться,иначе всем lgota_id присвоится одинаковое значение,что-то типа: SELECT lgota_id=(SELECT lgota_id FROM People WHERE MAX(identity) GROUP BY Fio), Fio, SUM(rasxod) FROM People GROUP BY Fio Дело еще
осложняется тем,что это здесь я привел идею в несколько полей а на самом деле в выборке задействовано много полей,некоторые надо исключить из группировки но оставить их последние (в данном случае я имею в виду по времени внесения изменений но они как я и заметил находятся физически при просмотре без сортировки в последних строках таблицы) значения для дальнейшей работы. Причем среди этих полей есть нетолько числовые,но и строки и даты. Спасибо,но кроме
теории никаких идей Вы неподкинули.
Отвечает: КиберТварь
Здравствуйте, Трофименко А.В.!
можно использовать еще одно поле ID которая будет auto_increment
alter table people add column id int not null;
и потом сделать это поле TABLE Identity Column
и при выборке дать
SELECT MAX(id), Fio, SUM(rasxod)
FROM People
GROUP BY Fio
Ответ отправил: КиберТварь (статус: Практикант)
Отправлен: 03.03.2006, 17:42 Оценка за ответ: 2 Комментарий оценки: Очень жаль,но ответ не по теме,видимо я плохо обьяснил. Вы предлагаете заменить lgota_id на id.Одно не равно другому. В дальнейшем надо работать имено с lgota_id. Вы по предложению Архангельского решили нормализовать БД и в итоге потеряли те данные которые нужны в дальнейшем, с таким же успехом можно было бы просто убрать поле lgota_id из выборки,но в том и дело,что оно
нужно в дальнейшем.