Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.11.2009, 18:02
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию Помогите сделать выборку SQL

Всем доброго времени суток...
Подскажите алгоритм построения выборки посредством SQL из таблиц Paradox...Суть задачи...
Есть 2 одинаковые по структуре таблицы...с полями Дата Номер Цена...есть таблица с полями Дата Сумма1 Сумма2...
Нужно из первых 2-х таблиц выбрать суммы цен за каждую дату...Затем эти суммы по датам перекинуть во 3-ю таблицу...
Напимер...
........Таблица1................................Та блица2
20.11.2009.....1.....100*******22.11.2009.....2... .125

21.11.2009.....2......20*******25.11.2009.....3... .252

22.11.2009.....3......30*******29.11.2009.....4... .20

21.11.2009.....4......25*******22.11.2009.....5... .123

23.11.2009.....5......32*******25.11.2009.....6... .100

В таблице 3 должно быть

20.11.2009.....100....0

21.11.2009.....45....0

22.11.2009.....30....248

23.11.2009.....32.....0

25.11.2009.....0....352

29.11.2009.....0....20

Я уже реализовал работу программы, но через циклы и SQl запросы и.т.п...т.е. мне моя реализация не нравится...
PS код реализации можно не писать, мне бы алгоритм...
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
  #2  
Старый 29.11.2009, 18:52
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Код:
SELECT [Дата], SUM([Цена])
FROM Table_Name
GROUP BY [Дата]

А объединять и вставлять придется руками.
Ответить с цитированием
  #3  
Старый 29.11.2009, 19:33
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Можно и без промежуточных телодвижений:
Код:
SELECT * INTO Table3
FROM (SELECT Tmp1.DateField, Sum(Tmp1.PriceField) AS SumOfPriceField
             FROM (SELECT DateField,NumberField,PriceField 
                          FROM Table1
                          UNION
                          SELECT DateField,NumberField,PriceField 
                          FROM Table2)  AS Tmp1
GROUP BY Tmp1.DateField)
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 29.11.2009 в 19:37.
Ответить с цитированием
  #4  
Старый 29.11.2009, 20:19
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

В Парадоксе?
Честно говоря давно с BDE не работал, так что не помню, что там поддерживается, а что - нет. Более того, у тебя там ошибка, т.к. там тогда нужен JOIN, а не UNION.
Ответить с цитированием
  #5  
Старый 29.11.2009, 21:34
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Почему Join? У него стоит задача собрать данные из двух таблиц в одну общую и по ней делать групировку по дате с получением суммы - что я и сделал.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 30.11.2009, 08:57
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Ладно попробую поиграться с выборкой Страдалецъ...Если что отпишусь...
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
  #7  
Старый 03.12.2009, 09:13
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

2 Страдалецъ...
Использовал твой вариант выборки...
Код:
SELECT * INTO Table3
FROM (SELECT Tmp1.DateField, Sum(Tmp1.PriceField) AS SumOfPriceField
             FROM (SELECT DateField,NumberField,PriceField 
                          FROM Table1
                          UNION
                          SELECT DateField,NumberField,PriceField 
                          FROM Table2)  AS Tmp1
GROUP BY Tmp1.DateField)
Переделал под себя для работы в runtime...
Код:
 with DataModule_.Query_Income do
 begin
  Close;
  SQL.Clear;
  SQL.Add('SELECT * INTO Income');
  SQL.Add('FROM');
  SQL.Add('(SELECT Tmp1.DateDay, Sum(Tmp1.Summ) AS SumOfSumm');
  SQL.Add('FROM');
  SQL.Add('(SELECT DateDay, NumberBill, Summ FROM ListBillGoods.db)');
  SQL.Add('UNION');
  SQL.Add('(SELECT Dateday, NumberBill, Summ FROM ListBillBread.db)AS Tmp1)');
  SQL.Add('GROUP BY Tmp1.DateDay)');
  Open;
 end;
Ругается "Invalid use of keyword" token INTO line 1...
Подскажи пожалуйста, что не так...что то я не совсем понимаю принцип команды SELECT INTO...понимаю, что создает временную таблицу Income, вот вопрос только в памяти или на диске...в сети мало что нашел, но продолжу...
__________________
В начале был Бит, потом Байт и только потом появилось Слово...

Последний раз редактировалось NIch, 03.12.2009 в 09:16.
Ответить с цитированием
  #8  
Старый 03.12.2009, 17:06
xanorik xanorik вне форума
Прохожий
 
Регистрация: 01.12.2009
Сообщения: 8
Репутация: 10
По умолчанию

Код:
insert into <Таблица3> (<Дата>, <Сумма>)
              (select <Дата>, sum(<Сумма>) 
               from (select <Дата>, <Сумма>
                       from <Таблица1>
                       union all
                       select <Дата>, <Сумма>
                       from <Таблица2>) 
               group by <Дата>)

и никаких циклов и куч запросов
P.S. работаю с Oracle, возможно, придется слегка адаптировать

Последний раз редактировалось xanorik, 07.12.2009 в 14:49.
Ответить с цитированием
  #9  
Старый 03.12.2009, 17:34
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Здесь наверное правильнее использовать не Open, а ExecSql т.к. фактически вывод перенаправляется в новую таблицу.
Если ругается на INTO, то в парадоксе возможно используется несколько измененный диалект SQL, а тут уже справку в руки.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:22.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter