![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запрос SQL [D7, IB6.x]
asail © (2006-07-17 18:45:00)Здрасте!!! Нужна помощь в составлении запроса...
Есть таблица вида
ID DATE PRICE
надо получить таблицу (результат) вида
ID DATE1 PRICE1 DATE2 PRICE2
где две строки исходной таблицы с максимальнамидатами превращаются в одну соответствующую запись. И так для всех ID.
Надеюсь, понятно объяснил...
Johnmen (2006-07-18 10:25:00) [1]Мдя... Тяжёлый случай...:)
Да и ладно
Asail (2006-07-18 09:48:00) [2]Короче говоря, надо повторить все строки исходной таблицы, но добавить к ним еще одно поле с предыдущим (последним) значением цены (если такая есть). Вот и все.
Кстати, как мне кажется, я нашел решение. Проведу тесты, и если да, то выложу сюда.
Но все равно буду признателен за другие варианты (возможно, более оптимальные).
Sergey13 (2006-07-18 09:41:00) [3]2 [10] Asail (18.07.06 00:11)
> понятно, что для некоторых товаров в исходной таблице может
> быть всего одна строка (т.е. цена не менялась вообще).
А может быть 8 или например 16 (обвал цен). Как это обрабатывать?
Johnmen (2006-07-18 09:32:00) [4]Ещё раз. Постановказадачи мне уже не интересна.
Приводи пример исходных данныхи результирующегонабора данных.
Что такое исходные ДАННЫЕ надо пояснить?
Asail (2006-07-18 00:11:00) [5]А это и есть исходные данные. Задача такая: в приведенной выше таблице (полей там несколько больше, но к делу они не относятся) хранится история изменения цен на различные товары (код товара - поле "ID"). Задача - отобразить за указанный период времени как менялись цены для каждого товара. Результирующая таблица должна выглядеть примерно (опускаем дополнительные поля с описанием товаров) так:
ID CHANGING_DATE NEW_PRICE OLD_PRICE
понятно, что для некоторых товаров в исходной таблице может быть всего одна строка (т.е. цена не менялась вообще). В таком случае OLD_PRICE должен быть NULL или 0.
Буду признателен за помощь.
Johnmen (2006-07-17 22:30:00) [6]Приводи пример исходных данных и результирующего набора данных.
Данные должны быть показательными, охватывающими все возможные варианты...
Asail (2006-07-17 21:48:00) [7]
> 1. Что такое СП?
Обшипка вышла - это ХП.
> 2. Возможно, но радости не доставит...:)
Это плохо... База не моя - ХП для данного отчета мне туда впихнуть вряд-ли дадут :-(. Надо-бы все на клиенте делать. Есть идеи какие-нибудь?
Fay (2006-07-17 20:12:00) [8]2 asail (17.07.06 19:53) [5]
> А без СП? Вообще, возможно такое?
На IB - нет
Johnmen (2006-07-17 20:12:00) [9]
> PEAKTOP © (17.07.06 19:15) [2]
Тема FIRST в плоскости IB6 не раскрыта...
> asail (17.07.06 19:53) [5]
> А без СП? Вообще, возможно такое?
1. Что такое СП?
2. Возможно, но радости не доставит...:)
asail (2006-07-17 19:53:00) [10]А без СП? Вообще, возможно такое?
Fay (2006-07-17 19:34:00) [11]2 PEAKTOP © (17.07.06 19:15) [2]
Зачем DISTINCT ?
PEAKTOP (2006-07-17 19:17:00) [12]Ну а дальше -
select * from my_proc;
PEAKTOP (2006-07-17 19:15:00) [13]ДОПУСТИМ, ТВОЯ ТАБЛИЦА НАЗЫВАЕТСЯ TMC_PRICE
CREATE PROCEDURE MY_PROC
RETURNS(
ID INTEGER,
DATE1 TIMESTAMP,
PRICE1 NUMERIC(15,3),
DATE2 TIMESTAMP,
PRICE2 NUMERIC(15,3)
)
AS
BEGIN
FOR SELECT DISTINCT TTP.ID, MAX(TTP."DATE") FROM TMC_PRICE TTP GROUP BY TTP.ID INTO :ID, :DATE1 DO
BEGIN
SELECT TP.PRICE
FROM TMC_PRICE TP
WHERE (TP.ID = :ID)
AND (TP."DATE" = :DATE1)
INTO :PRICE1;
SELECT FIRST 1 TP."DATE", TP.PRICE
FROM TMC_PRICE TP
WHERE (TP.ID = :ID)
AND (TP."DATE" IN (SELECT MAX(TTP."DATE") FROM TMC_PRICE TTP WHERE (TTP."DATE" < :DATE1)))
INTO :DATE2, :PRICE2;
END
END
Fay (2006-07-17 19:05:00) [14]2 asail (17.07.06 18:45)
> Надеюсь, понятно объяснил...
OK, всё ясно. Выкладывай остальные 2 желания!