2014-02-20 48 views
0

请原谅我的天真,我是使用Toad的Oracle SQL新手。我有一张销售记录表,称之为销售。它有客户记录(通过CustID)销售日期(SaleDate)和销售的项目(通过ItemID)。这是其他表格中的最终销售状态的Mview。Oracle SQL新手需要帮助查找类似记录

我试图构造查询返回CustIDSaleDateItemID如果该客户两个ItemID = A和ItemID = B在同一天降价销售,如果SaleDate 2013年7月1日和7之间/ 31/2013如果存在这种情况,我希望以CustIDSaleDateItemID返回这两个记录。我假设这两个记录将在不同的行上。

我一直在研究IN,EXISTS和子查询,但尚未采取正确的方法。该表有大约700万条记录,所以我需要一些相当有效的东西。有人能指出我在正确的方向来实现这一目标吗?我正在学习,但我需要更快地学习:)

吃掉了!

2/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就是为了摆脱日期的小时和分钟。

之间让你寻找当前的日期范围,你必须将它转换为日期,因为你正在传递一个字符串。

编辑: 意达是表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