Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объединение данных из разных таблиц, Access SQL Delphi 
V
    Опции темы
Juju
Дата 1.7.2008, 02:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 26.10.2006

Репутация: нет
Всего: 1



Ребята, 
есть три таблицы с данными, две из них связаны... 
нужно выбрать из них данные в 4-ую таблицу (через UNION я так полагаю), но сложность составляет с математическими вычислениями..
(Сразу оговорюсь, что БД уже работает... мне как всегда нужно пристроиться к уже готовой схеме)

1 таблица OPERATION (Операции)
ID 
CLIENT (идентификатор клиента)
D (дата операции)
ITEM1 (количество первой группы)
ITEM1_PRICE (цена первой группы)
ITEM2 (количество второй группы)
ITEM2_PRICE (цена второй группы)
...
(остановлюсь на двух для наглядности)

2 таблица RASHODY(Расходы) (т.е. каждой записи таблицы OPERATION соответствует одна и больше записей в таблице RASHODY)
ID
OPERATION (идентификатор операции т.е. ID в таблице OPERATION)
ITEM (предмет расхода)
PRICE (сумма по расходу)

3 таблица CREDIT (кредит который выдается клиенту)
ID
CLIENT (идентификатор клиента)
D (дата выдачи кредита)
SUMA (сума по кредиту)

Задача: сбить все данные в 4-ю таблицу вида:
CLIENT (идентификатор клиента) 
D (дата)
SUMA (сумма)

т.е. Чтобы получить SUMA в таблице OPERATION и RASHODY нужно просуммировать:(ITEM1*ITEM1_PRICE)+(ITEM2*ITEM2_PRICE) 
и вычесть все расходы (RASHODY) которые соответствуют операции(OPERATION):
SELECT SUM(PRICE)FROM RASHODY WHERE OPERATION =...??? <- вот тут у меня и стопор... как мне обозначить операцию???????

Напишу в целом запрос который я строил с ID клиента = 1
Знаки вопросов поставлю там где незнаю, как мне определить соответствующую записи операцию

Код

SELECT ID, D, CLIENT, 
(((ITEM1*ITEM1_PRICE)+(ITEM2*ITEM2_PRICE)- 
(SELECT SUM(PRICE)FROM RASHODY WHERE OPERATION = ???)))AS SUMA 
FROM OPERATION 
WHERE CLIENT = 1
UNION
SELECT ID,D,CLIENT,SUMA
FROM CREDIT
WHERE CLIENT = 1

PM MAIL   Вверх
Deniz
Дата 1.7.2008, 06:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 6
Всего: 44



Если я правильно понял, нужно пользоваться алиасами для таблиц:
Код
SELECT O.ID, O.D, O.CLIENT, 
(((ITEM1*ITEM1_PRICE)+(ITEM2*ITEM2_PRICE)- 
(SELECT SUM(PRICE)FROM RASHODY R WHERE R.OPERATION = O.ID)))AS SUMA 
FROM OPERATION O
WHERE CLIENT = 1
UNION
SELECT ID,D,CLIENT,SUMA
FROM CREDIT
WHERE CLIENT = 1
а зачем там CREDIT?


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Juju
Дата 1.7.2008, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 26.10.2006

Репутация: нет
Всего: 1



Deniz, спасибо за ответ, но я конечно же пробовал алиас перед тем как задать вопрос.
Вид был вот такой:
Код

SELECT O.ID, O.D, O.CLIENT, 
( ( (O.ITEM1*O.ITEM1_PRICE)+(O.ITEM2*O.ITEM2_PRICE)- 
(SELECT SUM(PRICE)FROM RASHODY R WHERE R.OPERATION = O.ID))*-1)AS SUMA 
FROM OPERATION O
WHERE O.CLIENT = 1
UNION
SELECT C.ID,C.D,C.CLIENT,C.SUMA
FROM CREDIT C
WHERE C.CLIENT = 1


>а зачем там CREDIT? 
Хотят видеть полную статистику по клиенту...
OPERATION (то что он отдает)
CREDIT (то что ему дают)
PM MAIL   Вверх
Juju
Дата 1.7.2008, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 26.10.2006

Репутация: нет
Всего: 1



Дело в том, что как только перехожу на алиасы в выводе кроме первой записи в поле SUMA пустые значения (со второй и дальше) там где собираеться значения операций (OPERATION), там где с таблицы CREDIT - все ок!
Например:
Дата                   Сумма
01.03.2008        -210 000 <- единственное значение, которое корректно(таблица OPERATION) 
02.03.2008                       <- пустое значение (таблица OPERATION) 
04.03.2008                       <- пустое значение (таблица OPERATION) 
07.03.2008         40 000   <-это к примеру значение из таб.CREDIT
09.03.2008                       <- пустое значение (таблица OPERATION) 
11.03.2008
13.03.2008
14.03.2008
15.03.2008
PM MAIL   Вверх
Juju
Дата 1.7.2008, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 26.10.2006

Репутация: нет
Всего: 1



И это происходит тогда, когда в RASHODY нет никакого значения, т.е. 
Код

SELECT SUM(PRICE)FROM RASHODY R WHERE R.OPERATION = O.ID

не имеет значения (NULL)!

Неужели чтобы 
Код

SELECT SUM(PRICE)FROM RASHODY R WHERE R.OPERATION = O.ID

возвращал 0, а не NULL там должно храниться 0-вое значение?
(то ли бессонная ночь дает о себе знать то ли...)

Это сообщение отредактировал(а) Juju - 1.7.2008, 16:42
PM MAIL   Вверх
Magnifico
Дата 1.7.2008, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 4
Всего: 17



select sum (isnull (price,0)) from....

к тому же тема слишком специфична (банковские операци и прочее)
чтобы сделать запрос нужна именно сама база , а не описание (хотя бы по 10 записей в каждой таблице)
я даже приблизительно незнаю как заполнить твои таблицы



--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
Juju
Дата 1.7.2008, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 26.10.2006

Репутация: нет
Всего: 1



Magnifico
В общем тут не банковские операции, а усложненный калькулятор как по мне, но видимо я не достаточно доходчиво объяснил smile
Имеем уже готовую БД, структуру которой, я не имею права изменять.
Действующие таблицы:
OPERATION
ID    CLIENT  D                  ITEM1   ITEM_PRICE    ITEM2    ITEM_PRICE
1      1           05.06.2008  100       30,00             100        45,00  
2      1           07.06.2008  200       30,00             200        45,00 
3      1           08.06.2008  150       35,00             100        50,00
4      2           10.06.2008  100       40,00             120        45,00  
5      3           20.06.2008  250       40,00             150        45,00  

RASHODY

ID   OPERATION  ITEM             PRICE
1     1                  транспорт   480,00
2     1                  гостиница   270,00
3     2                  питание      80,00
4     2                  транспорт   560,00
5     4                  разгрузка    300,00

CREDIT
ID   CLIENT    D                     SUMA
1    1             12.06.2008      4600,00
2    1             14.06.2008      3000,00
3    2             15.06.2008      1200,00
4    3             22.06.2008      6000,00
5    4             26.06.2008      1300,00


Задача: сбить все данные в 4-ю таблицу (например CLIENTCARD) вида:

CLIENT (идентификатор клиента) 
D (дата)
SUMA (сумма)

т.е. берем клиента с ID равным 1
Просчитываем операции(OPERATION-RASHODY) и выданные ему кредиты(CREDIT) (авансы, как угодно)
1) OPERATION.ID1         -   RASHODY (OPERATION.ID1)
(100*30 + 100*45) - (480+270) = 6750
имеем запись в CLIENTCARD:
CLIENT          D                        SUMA
1                   05.06.2008         6750

2) берем следующую операцию с клиентом и т.д............

т.е. для автоматизации процесса, чтобы запрос движения по клиенту с ID = 1 выглядело так:
CLIENT          D                        SUMA
1                   05.06.2008        -6750
1                   07.06.2008        -14360
1                   08.06.2008        -10250 
1                  12.06.2008         4600
1                  14.06.2008         3000

нужен запрос:
Код

SELECT O.ID, O.D, O.CLIENT, 
(((O.ITEM1*O.ITEM1_PRICE)+(O.ITEM2*O.ITEM2_PRICE)- 
(SELECT SUM(PRICE)FROM RASHODY R WHERE R.OPERATION = O.ID))*-1)AS SUMA 
FROM OPERATION O
WHERE O.CLIENT = 1
UNION
SELECT C.ID,C.D,C.CLIENT,C.SUMA
FROM CREDIT C
WHERE C.CLIENT = 1

и все бы хорошо, если бы не бы не операция 08.06.2008, где небыло ни одного расхода...
т.е. 
Код

SELECT SUM(PRICE)FROM RASHODY R WHERE R.OPERATION = O.ID

дает NULL и в таблице выводиться пустое значение:
CLIENT          D                        SUMA
1                   05.06.2008        -6750
1                   07.06.2008        -14360
1                   08.06.2008                                   <-------- вот здесь!!!!!
1                  12.06.2008         4600
1                  14.06.2008         3000

P.S.
Я конечно решил эту проблему путем добавления записи в таблицу RASHODY содержащей нулевое значение в поле PRICE, если в Операции не присутствуют расходы... И скрыл эту запись от пользователя... так что визуально ничего мулящего глаз не происходит НО ВЕДЬ ЭТО ПРОСТО "КРИВО РЕШЕННАЯ ПРОБЛЕМА!"


Это сообщение отредактировал(а) Juju - 2.7.2008, 09:20
PM MAIL   Вверх
Magnifico
Дата 2.7.2008, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 4
Всего: 17



есть подозрения что ты неправильно расчитываешь операции

посчитай сам вручную  по твоем у алгоритму за каждое число :

Цитата

CLIENT     D 
  1      05.06.2008              (100*30 + 100*45) - (480+270) =  6750
   1     07.06.2008            (200*30 + 200*45) -(480+270)  = 14250
   1      08.06.2008          (150*35 +100*50) - (480+270)  =   9500

o.id это у тебя  суррогатный ключ
o.id замени на o.client
Код

SELECT SUM(PRICE)FROM RASHODY R WHERE R.OPERATION = O.Client




Это сообщение отредактировал(а) Magnifico - 2.7.2008, 11:38


--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
Juju
Дата 2.7.2008, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 26.10.2006

Репутация: нет
Всего: 1



Magnifico, а чего это у тебя на разные операции все расходы одинаковые??? smile 
Вот тут ты ошибся... В таблице RASHODY есть поле OPERATION, которое содержит соответствующее ID таблицы OPERATION

Поэтому не такие расчеты должны быть:
CLIENT    D                      SUMA
 1            05.06.2008      (100*30 + 100*45) - (480+270) =  6750
 1            07.06.2008      (200*30 + 200*45) - (480+270)  = 14250
 1            08.06.2008      (150*35 +100*50) -  (480+270)  =   9500

а такие:
CLIENT    D                      SUMA
1             05.06.2008      (100*30 + 100*45) - (480+270) =  6750
1             07.06.2008      (200*30 + 200*45) - (80+560)  = 14360
1             08.06.2008      (150*35 +100*50)  - (0) =   10250

Дело в том, что когда расходы равны 0 как за 08.06.2008 значение в таблицу не выводятся...
А про сурогатный ключ - это ни к чему, т.к. сам запрос работает корректно, если только есть значение (пусть содержащее 0) по расходам...
Ладно... криво- не криво я сделал правильный вывод значений...
А вот Как подсчитать Сумму поля SUMA построенной таким запросом таблицы?
Т.е. если запросом:
Код

SELECT O.ID, O.D, O.CLIENT, 
(((O.ITEM1*O.ITEM1_PRICE)+(O.ITEM2*O.ITEM2_PRICE)- 
(SELECT SUM(PRICE)FROM RASHODY R WHERE R.OPERATION = O.ID))*-1)AS SUMA 
FROM OPERATION O
WHERE O.CLIENT = 1
UNION
SELECT C.ID,C.D,C.CLIENT,C.SUMA
FROM CREDIT C
WHERE C.CLIENT = 1


Мы получаем табличку:
CLIENT          D                        SUMA
1                   05.06.2008        -6750
1                   07.06.2008        -14360
1                   08.06.2008        -10250
1                   12.06.2008        4600
1                   14.06.2008        3000
Как подсчитать сумму поля SUMA этой таблицы?
PM MAIL   Вверх
Magnifico
Дата 2.7.2008, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 4
Всего: 17



первй вопрос так попробуй
Код

SELECT O.ID, O.D, O.CLIENT, (((O.ITEM1*O.ITEM1_PRICE)+(O.ITEM2*O.ITEM2_PRICE) 

  - (SELECT iif  (  isnull (  sum(PRICE) ) , 0 ,  sum(price)  )       FROM RASHODY R WHERE R.OPERATION = o.id ))  * -1) 

AS SUMA

FROM OPERATION AS O
WHERE O.CLIENT=1;

результат:
ID    D     CLIENT    SUMA
1    05.06.2008    1    -6 750.00р.
2    07.06.2008    1    -14 360.00р.
3    08.06.2008    1    -10 250.00р.

Добавлено через 2 минуты и 45 секунд
второй вопрос так попробуй

Код

select sum(suma)  as summa
from
(
SELECT O.ID, O.D, O.CLIENT, (((O.ITEM1*O.ITEM1_PRICE)+(O.ITEM2*O.ITEM2_PRICE) 

  - (SELECT iif  (  isnull (  sum(PRICE) ) , 0 ,  sum(price)  )       FROM RASHODY R WHERE R.OPERATION = o.id ))  * -1) 

AS SUMA


FROM OPERATION AS O
WHERE O.CLIENT=1

UNION
SELECT C.ID,C.D,C.CLIENT,C.SUMA
FROM CREDIT C
WHERE C.CLIENT = 1
) as q



--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
Juju
Дата 2.7.2008, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 26.10.2006

Репутация: нет
Всего: 1



Magnifico, ну что я могу еще сделать? 
Только В ОЧЕРЕДНОЙ РАЗ сказать тебе ОГРОМНОЕ СПАСИБИЩЕ!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0487 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.