Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Базы данных MySQL

  Все выпуски  

RusFAQ.ru: Базы данных SQL


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Базы данных SQL

Выпуск № 66
от 09.03.2006, 14:10

Администратор:Калашников О.А.
В рассылке:Подписчиков: 230, Экспертов: 34
В номере:Вопросов: 1, Ответов: 3


Вопрос № 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 или это невозможно.
Спасибо.
Александр.
Отправлен: 03.03.2006, 16:08
Вопрос задал: Трофименко А.В. (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Nrr
Здравствуйте, Трофименко А.В.

Чечтно говоря я не понял сути,
а так помогу,
мыло: 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
из выборки,но в том и дело,что оно нужно в дальнейшем.


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.17 от 09.03.2006
Яндекс Rambler's Top100

В избранное