Oracle SQL 新手需要帮助查找类似的记录



请原谅我的天真,我是使用Toad的Oracle SQL新手。我有一个包含销售记录的表,称之为销售。它有客户记录(按CustID)销售日期(SaleDate)和销售项目(按ItemID)。它实际上是其他表格的 Mview,其中包含最终销售状态。

我正在尝试构造一个查询以返回CustIDSaleDateItemID如果该客户在同一天都有销售,ItemID= A 和ItemID=B 如果在 2013 年 7 月 1 日至 2013 年 7 月 31 日SaleDate之间。如果存在这种情况,我希望两条记录都返回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

试试这个,当然替换"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 是为了摆脱日期的小时和分钟。

介于允许您查找当前日期范围,您必须将其转换为日期,因为您要传递一个字符串。

编辑:ItemA 是现有预言机中表 Mview 的别名:你能为 from 子句分配一个别名吗? sql 理解没有 AS 的别名,但如果它使您更容易阅读,您可以放置它。

在您发布的完整示例中,您没有使用 DDIS 的任何别名。PTS_MV_CLM_STAT,因此,数据库电机不会分散您引用的表,这就是您没有得到所需值的原因。

最新更新