powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Sql-запрос?
22 сообщений из 22, страница 1 из 1
Sql-запрос?
    #33496488
kms_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребяты, доброго всем времени суток!

Очень надеюсь на вашу помощь.
Вопросик вроде не сложный, но что-то как-то меня подклинило
Есть таблица:
Код: plaintext
1.
2.
3.
4.
5.
6.
kod   name                     date            suma
 1      Здание                    01 / 05 / 1994        10000 , 00 
 1      Ремонт здания             01 / 08 / 2002         1000 , 00 
 1      Модернизация здания       01 / 11 / 2005         1000 , 00 
 2      Автомобиль                01 / 12 / 1998        20000 , 00 
 2      Ремонт автомобиля         01 / 03 / 2003         2000 , 00 
 2      Модернизация автомобиля   01 / 07 / 2005         2000 , 00 

Есть запрос:
Код: plaintext
Select kod, name, date Sum(suma) From table1 Group by  1 
Запрос отрабатывает нормально, но при группировки записей по полю kod для остальных полей (name, date) выдает значение из последней строки группы, т.е. получается:
Код: plaintext
1.
2.
kod   name                     date             sum_suma
 1      Модернизация здания       01 / 11 / 2005         12000 , 00 
 2      Модернизация автомобиля   01 / 07 / 2005         24000 , 00 

А мне нужны для прочих полей (name, date) первые значения из группы:
Код: plaintext
1.
2.
kod   name                     date            sum_suma
 1      Здание                    01 / 05 / 1994        120000 , 00 
 2      Автомобиль                01 / 12 / 1998        240000 , 00 


кажется все правильно сформулировал. надеюсь на вашу помощь.
причем все это хочется сделать в одном запросе, как это делать с двумя я знаю.

Заранее благодарен.
...
Рейтинг: 0 / 0
Sql-запрос?
    #33496537
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kms_[/CSV]
А мне нужны для прочих полей (name, date) первые значения из группы:
Код: plaintext
1.
2.
kod   name                     date            sum_suma
 1      Здание                    01 / 05 / 1994        120000 , 00 
 2      Автомобиль                01 / 12 / 1998        240000 , 00 
|>

кажется все правильно сформулировал. надеюсь на вашу помощь.
причем все это хочется сделать в одном запросе, как это делать с двумя я знаю.
Заранее благодарен.
"Первое" - по какому критерию?
Что вы называете "первое значение" для поля Name ? Чего вы ожидаете получить?
Ваш запрос, кстати, не должен работать (не хватает запятой).
Ну попробуйте, например так:
Код: plaintext
1.
SELECT kod, MIN(name) AS Name, MIN(date) AS D_Max,  SUM(suma)  AS Suma
FROM table1 GROUP BY Kod
С уважением, Алексей
...
Рейтинг: 0 / 0
Sql-запрос?
    #33496652
kms_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей, отсутствие запятой я и сам заметил, но полинился исправить, надеясь, что меня поймут, а вот в остальном вы правы, я, действительно, не достаточно четко описал проблемку.

Первой я считаю ту строку, у которой более ранняя дата, то есть мне надо получить минимальное значение поля date (без проблем с помощью MIN) и соотвествующее ему значение поля name (а вот тут уже проблемы) так как нет никакого обособленного критерия для поля name!!!
...
Рейтинг: 0 / 0
Sql-запрос?
    #33496654
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kms_...
А мне нужны для прочих полей (name, date) ...
В SQL нет понятия первая запись и твой запрос вообще работать не будет в стандартном SQL. Фокс (до версии 8.0) позволяет тебе выполнить такой запрос считая что все значения этих одинаковые при заданном уровне группировки. Например если это значения дочернего справочника, по id которого все группируется.

Твою выборку можно делать только scan`ом
...
Рейтинг: 0 / 0
Sql-запрос?
    #33496740
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kms_
Первой я считаю ту строку, у которой более ранняя дата, то есть мне надо получить минимальное значение поля date (без проблем с помощью MIN) и соотвествующее ему значение поля name (а вот тут уже проблемы) так как нет никакого обособленного критерия для поля name!!!
Но если вы не знаете критерия выборки "ПЕРВОГО" значения по полю Name, то компьютер и тем более его не знает. Если нет связи между Kod и Name, то задача не имеет решение или семантика запроса не верна. Поясните, что означает поля Kod и Name (да и дата).
С уважением, Алексей.
...
Рейтинг: 0 / 0
Sql-запрос?
    #33496951
kms_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей, есть таблица в которой хранятся данные о поступлении основного средства, о его ремонтах и произведенных модернизациях. Соответственно запись о вводе основного средства всегда будет иметь более раннюю дату, чем проведенные ремонты и модернизации и соответственно физически в таблице будут расположены всегда выше, так как введены в таблицу раньше(именно такую табличку я и привел в примере).
Теперь далее, мне необходимо собрать общую сумму затрат по объекту, то есть сумму его приобретения и всех прочих ремонтов, Если я делаю это тем селектом, который я привел в примере, то сумму он выдает, а остальные позиции, по которым не использована функция суммирования соответствуют строке, которая физически в исходной таблицы в рамках группы является последней, то есть получается, что на экране появляется табличка в которой указана общая сумма, а вместо названия самого объекта написано что-то типа "Капитальный ремонт энергоблока №12" и дата стоит этого самого капитального ремонта.
И если дату я могу выбрать дату по условию МИН(), то название мне нужно то, которое соответствует минимальной дате, то есть название самого объекта.
...
Рейтинг: 0 / 0
Sql-запрос?
    #33496967
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kms_
Первой я считаю ту строку, у которой более ранняя дата, то есть мне надо получить минимальное значение поля date (без проблем с помощью MIN) и соотвествующее ему значение поля name (а вот тут уже проблемы) так как нет никакого обособленного критерия для поля name!!!

Если условие такое то в два запроса

Код: plaintext
1.
2.
select kod, min(date) as mdate, sum(suma) as sum from tbl group by kod into cursor temp
select dist tbl.kod, tbl.name, tbl.date, temp.sum from tbl left join tmp on tbl.kod=temp.kod where tbl.date=temp.mindate into cursor result

Только одно но: если есть две записи с одинаковыми kod, date и разными name выбирутся обе строки. Правда такое событие в постановке не значится :)
...
Рейтинг: 0 / 0
Sql-запрос?
    #33496980
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kms_Алексей, есть таблица в которой хранятся данные о поступлении основного средства, о его ремонтах и произведенных модернизациях. Соответственно запись о вводе основного средства всегда будет иметь более раннюю дату, чем проведенные ремонты и модернизации и соответственно физически в таблице будут расположены всегда выше, так как введены в таблицу раньше(именно такую табличку я и привел в примере).
Теперь далее, мне необходимо собрать общую сумму затрат по объекту, то есть сумму его приобретения и всех прочих ремонтов, Если я делаю это тем селектом, который я привел в примере, то сумму он выдает, а остальные позиции, по которым не использована функция суммирования соответствуют строке, которая физически в исходной таблицы в рамках группы является последней, то есть получается, что на экране появляется табличка в которой указана общая сумма, а вместо названия самого объекта написано что-то типа "Капитальный ремонт энергоблока №12" и дата стоит этого самого капитального ремонта.
И если дату я могу выбрать дату по условию МИН(), то название мне нужно то, которое соответствует минимальной дате, то есть название самого объекта.
Какое смысл имеет поле KOD ?
С уважением, Алексей.
...
Рейтинг: 0 / 0
Sql-запрос?
    #33497022
kms_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это инвентарный номер объекта
...
Рейтинг: 0 / 0
Sql-запрос?
    #33497049
valeryka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет Kms!


выдает значение из последней строки группы


Сам же и ответил, как выбрать то, что тебе необходимо
...
Рейтинг: 0 / 0
Sql-запрос?
    #33497062
kms_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, Valeryka!

Возможно, вы меня знаете лучше чем я сам , но чесное слово я не понимаю, как это я сам же ответил на то, что мне необходимо!
А вообще, спасибо за участие! ;-)
...
Рейтинг: 0 / 0
Sql-запрос?
    #33497080
valeryka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Надеюсь order by еще имеет какое-то значение в SQL
Так и выбери в первом запросе тот порядок который тебя устроит,
а во втором группируй
...
Рейтинг: 0 / 0
Sql-запрос?
    #33497099
kms_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valeryka, то что вы пишите - это конечно замечательно, но есть одно но: в самом начале я писал:
kms_причем все это хочется сделать в одном запросе, как это делать с двумя я знаю
...
Рейтинг: 0 / 0
Sql-запрос?
    #33497137
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kms_Это инвентарный номер объекта
Тогда почему один и тот-же и инвентарный номер имеют РАЗНЫЕ объекты?
Или я не правильно понял значение поля Name?
С уважением, Алексей.
...
Рейтинг: 0 / 0
Sql-запрос?
    #33497150
kms_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
потому что это не основная таблица, а таблица, которая хранит информацию о движении, то есть всякие там увеличения стоимости, списания внутренние перемещения и т.д.
Конечно, я понимаю, что можно взять из основной таблицы инвентарный и наименование, а сумму уже из движения, но тем не менее, раз уж проблемка, появилась, то было интересно найти решение.
...
Рейтинг: 0 / 0
Sql-запрос?
    #33497180
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kms_потому что это не основная таблица, а таблица, которая хранит информацию о движении, то есть всякие там увеличения стоимости, списания внутренние перемещения и т.д.
Конечно, я понимаю, что можно взять из основной таблицы инвентарный и наименование, а сумму уже из движения, но тем не менее, раз уж проблемка, появилась, то было интересно найти решение.
Тогда не понятно, что за таблица, структура которой вы привели в первом своем собщении ? Какова семантика поля Name ?
С уважением, Алексей.
...
Рейтинг: 0 / 0
Sql-запрос?
    #33497206
valeryka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Желание в одном - это связано с религией
...
Рейтинг: 0 / 0
Sql-запрос?
    #33497234
kms_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей, раз уж "пошла такая пьянка" , то конкретнее:

Есть таблица: oss, в ней хранится актуальный реестр основных средств со всеми необходимыми данными.
Есть еще одна табличка: oss_dv, в ней хранятся все "движения" (поступления, списания и т.д.)

Когда предприятие приобретает объект ОС, то ни в первой ни во второй таблице его нет. Оператор заполняет карточку учета ОС и объект попадает и в первую таблицу и во вторую, естественно дата ввода соответствующая, названия одинаковые (все одинаковое в двух таблицах), но в таблице с движением указан соответствующий код операции (например 42-приобретение ОС).


Предположим через 5 лет этот объект подвергается модернизации, по завершении которой составляется соответствующий акт, и сумма затрат на модернизацию относится на увеличение стоимости основного средства. Тогда при проведении этой операции в программе, в таблицу oss_dv заносится запись, где указывается инвентарный номер объекта, дата проведения операции (дата ввода) и сумма, а название пишется таким образом, чтобы было понятно, что это не сам объект, а его модернизация " Модернизация энергоблока №12". В таблице же oss по соответствующему инвентарному номеру увеличивается первоначальная стоимость на сумму модернизации.
Вот и получается, что в таблице Oss_dv будет уже две записи с одним и тем же номером, но каждая несет свою информацию, одна содержит информацию о первоначальном приобретении объекта, а другая о его модернизации.
...
Рейтинг: 0 / 0
Sql-запрос?
    #33497242
kms_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valeryka, уважаю ваш юмор , но иногда из таких "связей с религией" выходят очень дельные вещи.
...
Рейтинг: 0 / 0
Sql-запрос?
    #33497344
valeryka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Охота пуще неволи

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SET ENGINEBEHAVIOR  70 
CREATE CURSOR vasya (kod c( 1 ),name c( 3 ),date d,suma n( 10 , 2 ))
INSERT INTO vasya value('1','1',{ 01 . 05 . 1994 }, 10000 )
INSERT INTO vasya value('1','2',{ 01 . 08 . 2002 }, 1000 )
INSERT INTO vasya value('1','3',{ 01 . 11 . 2005 }, 1000 )
INSERT INTO vasya value('2','1',{ 01 . 12 . 1998 }, 20000 )
INSERT INTO vasya value('2','2',{ 01 . 03 . 2003 }, 2000 )
INSERT INTO vasya value('2','3',{ 01 . 07 . 2005 }, 2000 )
SELECT kod,date,SUM(suma) total,RIGHT(Min((kod+DTOC(date, 1 )+name)), 3 ) name FROM vasya GROUP BY kod
...
Рейтинг: 0 / 0
Sql-запрос?
    #33497453
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот теперь все понятно.
У вас есть карточка основного средства ОС (KOD - его уникальный идентификатор).
Есть документы изменения состояния ОС (постановка на учет, ремонт, модернизация и пр.), которые имеют наименование (Name), дату (Date) и сумму операции (Suma)
Т.е. вам нужна сумма всех операци c данным ОС, но с выводом наименования и даты самой последней (по дате) операции.
В этом случае можно так (Для T-SQL и VFP 9.0):
Таблица oss (Kod, ....) - основные средства
Таблица oss_dv (Name, Kod, Date, Suma, ....) - операции с ОС
Код: plaintext
1.
2.
SELECT oss.Kod, SUM(oss_dv.Suma) AS Sum, MAX(oss_dv.Date) AS Max_Data
, Name = (SELECT TOP  1  t.Name FROM oss_dv t WHERE t.Kod = oss.Kod ORDER BY t.Date DESC)
FROM oss INNER JOIN oss_dv ON oss.Kod = oss_dv.Kod

С уважением, Алексей
...
Рейтинг: 0 / 0
Sql-запрос?
    #33497507
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, в конце, конечно, должен быть ...GROUP BY oss.Kod
и, если надо, сортировка - ORDER BY oss.Kod

Код: plaintext
1.
2.
3.
4.
SELECT oss.Kod, SUM(oss_dv.Suma) AS Sum, MAX(oss_dv.Date) AS Max_Data
, Name = (SELECT TOP  1  t.Name FROM oss_dv t WHERE t.Kod = oss.Kod ORDER BY t.Date DESC)
FROM oss INNER JOIN oss_dv ON oss.Kod = oss_dv.Kod
GROUP BY oss.Kod
ORDER BY oss.Kod
С уважением, Алексей
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Sql-запрос?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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