2014-09-24 32 views
1

我有一个会计情况,我们在同一会计情况下支付(政策交易类型NBS)和负面(政策交易类型取消或XLN)。我需要的行只有同一个客户的Tran Type'NBS'和'XLN'。SQL查询:如果存在值,我需要两行

实施例的数据:

Client  PolicyNo Revenue TranType 
    ------------------------------------------- 
    John Doe Pol1234 1000.00  NBS 
    John Doe Pol1234 -1000.00  XLN 
    Jane Loe Pol5675 9000.00  NBS 
    Jane Loe Pol5676 8000.00  NBS 
    Bill Foe Pol0985 1000.00  NBS 
    Bill Foe Pol0987 -1000.00  XLN 

的查询需要的前两行只返回作为客户端和PolicyNo匹配也因为每一个都是NBS和XLN。如果同一客户的两条线路都是NBS,或者它们都是XLN,则需要将其排除。如果PolicyNo不匹配,则需要排除。

现在,我的查询返回全套。 (我省略了一些列从我上面的例子为简单起见

SELECT 
Company_1.Name, 
isnull(Customer.FirmNameCust, 
isnull(Customer.FirstName + ' ', '') + isnull(Customer.LastName, '')) AS Client, 
BasicPolInfo.PolNo,        
DirectBillEntryHeader.StmtDate, 
irectBillEntryHeader.Description, 
DirectBillEntryDetail.* 
FROM DirectBillEntryHeader 
INNER JOIN 
DirectBillEntryDetail 
ON DirectBillEntryHeader.DBEHId = DirectBillEntryDetail.DBEHId 
INNER JOIN BasicPolInfo 
ON DirectBillEntryDetail.PolId = BasicPolInfo.PolId 
INNER JOIN Customer 
ON DirectBillEntryDetail.CustId = Customer.CustId 
AND BasicPolInfo.CustId = Customer.CustId 
INNER JOIN Company 
ON DirectBillEntryDetail.WritingCoCode = Company.CoCode 
INNER JOIN Employee 
ON Customer.Prod1Code = Employee.EmpCode 
INNER JOIN Company Company_1 
ON Company.ParentCoCode = Company_1.CoCode 
     WHERE (DirectBillEntryDetail.TranType = 'NBS') 
     AND (DirectBillEntryHeader.StmtDate >= DateAdd(DD, - 30, GETDATE())) 
     OR (DirectBillEntryDetail.TranType = 'XLN') 
     AND (DirectBillEntryHeader.StmtDate >= DateAdd(DD, - 30, GETDATE())) 
+1

您展现漂亮的简单的样本数据。然后你显示,有七个表的查询。可以简化问题,把重点放在你需要? – 2014-09-24 14:57:33

回答

1

你可以使用EXISTS:。

SELECT t1.* 
FROM dbo.TableName t1 
WHERE t1.TranType IN('NBS','XLN') 
AND EXISTS 
(
    SELECT 1 FROM dbo.TableName t2 
    WHERE t1.Client = t2.Client 
     AND t1.PolicyNo = t2.PolicyNo 
     AND t1.TranType <> t2.TranType 
     AND t2.TranType IN('NBS','XLN') 
) 
+0

这工作蒂姆!谢谢!!! – 2014-09-24 21:46:03

+0

@LeifH:我很高兴听到这个消息。考虑接受一个答案。 – 2014-09-24 22:00:01

0

查找,通过使用GROUP BY和HAVING有两种类型的所有客户端/策略,然后使用这在你的FROM子句,所以你只能得到那些客户机/策略。

select ... 
from 
(
    select client, policyno 
    from mytable 
    where trantype in ('NBS','XLN') 
    group by client, policyno 
    having count(distinct trantype) = 2 
) wanted 
inner join sometable on sometable.client = wanted.client and sometable.policyno = wanted.policyno 
...