2014-02-20 4 views
0

Прошу простить мою наивность, я новичок Oracle SQL, использующий Toad. У меня есть таблица с записями продаж, назовите ее Sales. Он имеет записи о клиентах (по CustID) о дате продажи (SaleDate), и товар продан (по ItemID). Это Mview фактически других таблиц с окончательным статусом продаж в нем.Oracle SQL Newbie нужна помощь в поиске похожих записей

Я пытаюсь построить запрос для возврата CustID, SaleDate и ItemID если есть продажа в тот же день для этого клиента для обоих ItemID = A и ItemID = B, если между SaleDate 7/1/2013 и 7/31/2013 года. Если это условие существует, я хочу, чтобы обе записи были возвращены с CustID, SaleDate и ItemID. Я предполагаю, что две записи будут на отдельных строках.

Я изучал IN, EXISTS и подзапросы, но еще не наступил на правильный подход. В таблице содержится около 7 миллионов записей, поэтому мне нужно что-то достаточно эффективное. Может ли кто-нибудь указать мне в правильном направлении, чтобы достичь этого? Я учусь, но мне нужно учиться быстрее :)

ПОЛУЧАЙТЕ!

24/24/2014: Привет, я получил его, и он возвращает результаты на той же строке. Одно предостережение. В моем первоначальном примере я искал даты, когда существовали как 5P311, так и 6R641. На самом деле я хотел, чтобы все дни, где существует 5P311 и любые значения из группы RES, из которых 6R641 является членом. Код ниже достигает результатов, как мне они нужны:

SELECT ItemA.CLM_SSN, 
     ItemA.CLM_SERV_STRT Service_Date, 
     ItemA.CLM_COST_CTR_NBR, 
     ItemA.CLM_RECV_AMT, 
     ItemB.CLM_COST_CTR_NBR RES_Cost_Center, 
     ItemB.CLM_RECV_AMT, 
     GroupCode, 
     Service 

FROM DDIS.PTS_MV_CLM_STAT ItemA, 
     DDIS.PTS_MV_CLM_STAT ItemB, 
     DDIS.CST_SERV 

WHERE TRUNC(ItemA.CLM_SERV_STRT) between to_date ('01-07-2013','dd-mm-yyyy') and to_date('31- 07-2013','dd-mm-yyyy') 
    and TRUNC(ItemA.CLM_SERV_STRT) = TRUNC(ItemB.CLM_SERV_STRT) 
    and TRIM(ItemA.CLM_COST_CTR_NBR) = '5P311' 
    and ITEMB.FK_SERV = CST_SERV.PKSERVICE 
    and CST_SERV.GroupCode = 'RES' 
    and Itema.CLM_SSN = ItemB.CLM_SSN 
    and ItemA.CLM_RECV_AMT <> 0 
    and ItemB.CLM_RECV_AMT <> 0 

ORDER BY ItemA.CLM_SSN, ItemA.CLM_SERV_STRT 
+0

@ user2989408 См. Код, который я разместил выше. Он возвращает все записи из временного интервала, а не только из двух значений в операторе WHERE. Я все еще пытаюсь понять это. Любая помощь будет оценена по достоинству. Спасибо – user3334579

ответ

0

Попробуйте заменить «A» и значения «B», конечно

SELECT CustID, SaleDate, ItemID 
FROM Mview AS mv 
WHERE EXISTS(SELECT 1 FROM Mview AS itemA WHERE itemA.ItemID = 'A' 
      AND TRUNC(itemA.SaleDate) = TRUN(mv.SaleDate)) 
AND EXISTS(SELECT 1 FROM Mview AS itemB WHERE itemB.ItemID = 'B' 
      AND TRUNC(itemB.SaleDate) = TRUNC(mv.SaleDate)) 
AND mv.SaleDate BETWEEN TO_DATE ('2003/01/07', 'yyyy/mm/dd') 
AND TO_DATE ('2003/01/31', 'yyyy/mm/dd'); 

существует в сочетании гарантирует вам, что есть продай день, который имел эти 2 пункта, TRUNC в этой дате - избавиться от часов и минут даты.

Между вами можно искать текущий диапазон дат, вам нужно преобразовать его в дату, поскольку вы передаете строку.

Edit: Itema является псевдонимом для таблицы MView внутри существует oracle: can you assign an alias to the from clause? SQL понять псевдоним без AS, но вы можете поместить его, если это делает его более легким для вас читать.

В полном примере, который вы опубликовали, вы не используете какой-либо псевдоним для DDIS.PTS_MV_CLM_STAT, поэтому двигатель базы данных не отделяет таблицу, на которую вы ссылаетесь, и именно поэтому вы не получаете нужные значения.

+0

@ Sr.PEDRO Я все еще изучаю интерфейс StackOverflow, извините. См. Мой ответ ниже. Я получаю результаты, но не то, что ожидаю. Он возвращает все записи с этого временного интервала. – user3334579

+0

См. Отредактированный ответ –

+0

Подвешивание - я вижу свою проблему. Игнорируйте то, что я написал ниже. Я нахожусь на этом, но сначала должен пойти на встречу ..... Я исправлю это. [Шлепок лоб ....] – user3334579

Смежные вопросы