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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Добавить таблицы в запрос, добавить еще 2 поля в существующий запро 
:(
    Опции темы
Диас
Дата 19.6.2008, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте! СУБД Oracle 8i. Такая проблема: есть такой запрос:

Код

SELECT /*+ ordered index(A TM_SAL_MST_IX15) */  /* tune 020611 */
       A.ORDER_NO               ORDER_NO,
       A.BILL_TO                BILL_TO,
       A.CUST_CD                SHIP_TO,
       to_char(to_date(A.INVO_DATE, 'yyyymmdd'), 'YYYY/MM/DD') INVO_DATE,
       B.INVO_NO                INVO_NO,
       D.PRODUCT                PRODUCT,
       B.MODEL                  MODEL,
       NVL(B.PICK_QTY, 0)       SALES_QTY,
       NVL(B.TOT_AMT_LOC,0)                  TOT_AMT,
       NVL(B.TAX_AMT1_LOC,0)                  +
       NVL(B.TAX_AMT2_LOC,0)                  +
       NVL(B.TAX_AMT3_LOC,0)                  +
       NVL(B.TAX_AMT4_LOC,0)                  +
       NVL(B.TAX_AMT5_LOC,0)                  TAX_AMT,
 D.PUR_TYPE PUR_TYPE                    
FROM  TM_SAL_MST A, TM_SAL_DTL B, TM_MODEL D
      
WHERE A.ORDER_NO   = B.ORDER_NO
  AND A.COM_CODE   = B.COM_CODE
  AND A.DIV_CODE   = B.DIV_CODE
  AND A.DIV_CODE   = 'SAR'
  AND A.STATUS     = 'INVO'
  AND B.MODEL      = D.MODEL
  AND B.SUFFIX     = D.SUFFIX
  AND B.COM_CODE   = D.COM_CODE
  AND A.COM_CODE   = 'LGEAK'
  AND ( A.DIV_CODE    IN ('ALL'  ) OR A.DIV_CODE     =    DECODE('ALL' , 'ALL', A.DIV_CODE  , NULL) )
  AND A.INVO_DATE  >= :DATE1         AND A.INVO_DATE  <= :DATE2
 and a.INVO_NO not in (select invoiceno from m3_kb_inv where invoicedate >= :DATE3 
                                        and  invoicedate <= :DATE4) 


в него нужно добавить еще 2 поля из 2х разных таблиц.

1) поле PERCENT из таблицы M3_KB_PERCENT С. Причем чтоб С.DealerCode=A.Bill_To и C.Date1<A.Invo_Date+1. Но таких записей удовлетворяющим условию может   быть несколько. И тут может быть 2 варианта:
  а)если записей 2 и больше, то нужно взять значение той, чья дата позже (больше), если всего одна или вообще нет, то нужно вернуть 0.
  б)то же самое, только если в первом варианте условие было >=2, то тут >=1. И только если записей вообще нет вернуть 0.

2) если поле PERCENT <> 0 тогда добавить поле sum(KBAmount) из таблицы M3_KB_INV E. Причем E.InvoiceDate>=C.Date1(та максимальная дата из записи которой взяли поле PERCENT) и E.ClientId=A.Bill_To.

Если что непонятно объяснил, уточняйте. Сам еще пока в стадии понимания потребности. Заранее благодарю.
PM MAIL   Вверх
Диас
Дата 20.6.2008, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



может что-то типа такого?
в раздел WHERE добавить такие строчки:

Код

and c.dealercode = a.bill_to
  and c.date1 = (select max(date1) from m3_kb_percent e where e.dealercode = a.bill_to
                                                          and e.date1 <= '19/06/2008')


Но так он не выдает те записи, которым нет соответствия в С, а нужно
PM MAIL   Вверх
Deniz
Дата 20.6.2008, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Диас @  20.6.2008,  10:47 Найти цитируемый пост)
Но так он не выдает те записи, которым нет соответствия в С, а нужно 
значит надо еще условия добавить во внутренний select.


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


Шустрый
*


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

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



так из С он берет все записи, просто там нет записей которые относятся к некоторым записям таблицы А.


Код

SELECT 
       A.BILL_TO                BILL_TO,
       B.INVO_NO                INVO_NO,
       D.PRODUCT                PRODUCT,
       
       c.percent                percent,
       c.date1                  date1,
       c.amount                 amount    
                    
FROM  TM_SAL_MST A,  TM_SAL_DTL B, m3_kb_percent c, TM_MODEL D
   
WHERE A.ORDER_NO   = B.ORDER_NO
  AND A.COM_CODE   = B.COM_CODE
  AND A.DIV_CODE   = B.DIV_CODE
  AND A.DIV_CODE   = 'SAR'
  AND A.STATUS     = 'INVO'
  AND B.MODEL      = D.MODEL
  AND B.SUFFIX     = D.SUFFIX
  AND B.COM_CODE   = D.COM_CODE
  AND A.COM_CODE   = 'LGEAK'
  AND ( A.DIV_CODE    IN ('ALL'  ) OR A.DIV_CODE     =    DECODE('ALL' , 'ALL', A.DIV_CODE  , NULL) )
  AND A.INVO_DATE  >= '20080619'         AND A.INVO_DATE  <= '20080619'
  
  and a.bill_to = c.dealercode
  and c.date1 = (select max(date1) from m3_kb_percent e where e.dealercode = a.bill_to
                                                          and e.date1 <= '20/06/2008')

Если убрать из запроса все что касается С, то запрос выдает 30 записей. А вместе с таблицей С только 18.
А мне надо чтобы выдавал те же 30, просто в остальных 12ти, которым нет соответствия в таблице С, чтоб проставил нули в столбцах из С.
PM MAIL   Вверх
Диас
Дата 23.6.2008, 05:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Если написать так:
Код

and a.bill_to = c.dealercode(+)
 то выдает все нужные записи, но нельзя так написать для подзапроса. Т.е.
Код

and c.date1(+) = (select max(date1) from m3_kb_percent e where e.dealercode = a.bill_to
                                                          and e.date1 <= '20/06/2008')
 я написать не могу. Как быть?

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


Эксперт
***


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

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



Написать в join
Код

select ...
from TM_SAL_MST A left join m3_kb_percent c on 
(
  (a.bill_to = c.dealercode)
  and 
  (c.date1 = (select max(date1) from m3_kb_percent e where e.dealercode = a.bill_to and e.date1 <= '20/06/2008'))
)
...
не совсем понял какую таблицу брать полностью А или С, соот-но А left C(вся А), или C left A (вся С).


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


Шустрый
*


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

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



В том-то и дело, что Оракл 8ой к великому сожалению не понимает Join! Там вместо джоина в where надо ставить (+), но к подзапросу так делать нельзя :(
PM MAIL   Вверх
Deniz
Дата 23.6.2008, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Диас @  23.6.2008,  14:04 Найти цитируемый пост)
В том-то и дело, что Оракл 8ой к великому сожалению не понимает Join!
 smile что правда?


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


Шустрый
*


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

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



Правда!  smile  Вот и приходится...
PM MAIL   Вверх
Диас
Дата 27.6.2008, 05:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



так без джойнов никак?
PM MAIL   Вверх
Диас
Дата 30.6.2008, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Как можно в запросе
Код

select
 BILL_TO, INVO_NO, PRODUCT, md, r.amount am, r.percent per
from 
(select A.BILL_TO BILL_TO,
B.INVO_NO INVO_NO,
D.PRODUCT PRODUCT,
t.max_date md

  from TM_SAL_MST A, TM_SAL_DTL B, TM_MODEL D, 
    (select max(date1) max_date, e.dealercode from m3_kb_percent e where e.date1 <= '19/06/2008' group by e.dealercode) t
  where 
A.ORDER_NO = B.ORDER_NO
AND A.COM_CODE = B.COM_CODE
AND A.DIV_CODE = B.DIV_CODE
AND A.DIV_CODE = 'SAR'
AND A.STATUS = 'INVO'
AND B.MODEL = D.MODEL
AND B.SUFFIX = D.SUFFIX
AND B.COM_CODE = D.COM_CODE
AND A.COM_CODE = 'LGEAK'
AND ( A.DIV_CODE IN ('ALL' ) OR A.DIV_CODE = DECODE('ALL' , 'ALL', A.DIV_CODE , NULL) )
AND A.INVO_DATE >= '20080619' AND A.INVO_DATE <= '20080619'
and  t.dealercode(+) = a.bill_to),
m3_kb_percent r

where 
 r.date1(+)=md
 and r.dealercode(+)=bill_to

в подзапросе
Код

(select max(date1) max_date, e.dealercode from m3_kb_percent e where e.date1 <= '19/06/2008' group by e.dealercode) t

вместо статичной даты использвать A.Invo_Dtae????
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




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


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

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