2011-02-24 166 views
0

我似乎很困扰一个问题。我使用Crystal Reports 2008从MS-SQL数据库中提取记录列表。有两个表涉及(它们包含订户的订单数据)。第一个表是OrderMst,第二个表是OrderDtl。它们由两个字段Account和SubNumber加入。每个帐户都有许多子编号,每个子编号都有许多发票编号。每个发票行都有一列告诉我是否是最近的发票。我需要查看此记录以确定客户是否处于活动,取消或过期状态。然后,根据他们的状态,我需要选择该子编号的所有发票。我陷入困境试图找出一种方法来做到这一点。根据组中的一条记录选择一组记录

下面是一个例子:

OrderMst:

Account  SubNumber Pub 
72781651 0025  NAVL 
72781651 0012  RYIR 
72781651 0001  RHCS 
80156287 0015  VGFA 
80156287 0012  NAVL 

OrderDtl:

Account  SubNumber InvoiceNumber PubStatus RenewalThere 
72781651 0025  15894578  A   0 
72781651 0025  15754897  R   1 
72781651 0025  15753412  R   1 
72781651 0012  15753357  C   0 
72781651 0012  15749875  R   1 
72781651 0001  15465874  X   0 
72781651 0001  15425789  R   1 
80156287 0015  15656738  A   0 
80156287 0012  15387956  C   0 
80156287 0012  15324568  R   1 

所以,如果我正在寻找所有的发票主动订阅的数量,我会选择{OrderDtl.RenewalThere} = 0,我的报告结果将显示帐户72781651子编号0025有3个发票和帐户80156287子编号0015有1个发票。这是我卡住的地方。我需要使用一个发票级别记录来告诉我需要哪个订阅,然后获取该发票的所有发票级别记录。有任何想法吗?

回答

1

你想要的是一个半联接:

SELECT Account, SubNumber, COUNT(*) 
    FROM OrderDtl 
WHERE EXISTS (
    SELECT * 
    FROM OrderDtl AS a 
    WHERE a.Account = OrderDtl.Account 
     AND a.SubNumber = OrderDtl.SubNumber 
     AND a.PubStatus = 'A' 
     AND a.RenewalThere = 0 
) 
GROUP BY Account, SubNumber 

HTH

+0

这工作就像一个魅力...谢谢!我还有另一个问题。我正在选择取消的客户。一切都是一样的,除了我只想选择取消日期5年内的发票。发票日期存在于每一行,取消日期只存在于最近的发票上(其中RenewalThere = 0)。有任何想法吗? – 2011-02-24 22:19:31

+0

粗略猜测,因为我手边没有表格,它应该像将a.PubStatus ='A'改为a.PubStatus ='C'(假设C表示取消)并添加标准一样简单例如:AND a.CancelDate <= DATEADD(Year,5,OrderDtl.InvoiceDate)。如果CancelDate出现在InvoiceDate(“a.CancelDate> = DATEADD(Year,-5,OrderDtl.InvoiceDate)”后面(如果InvoiceDate出现在CancelDate后面);如果它可以是 - 然后添加一个OR来使用这两个条件)。 – 2011-02-24 22:37:40

+0

优秀的假设!这工作完美。再次感谢!! – 2011-02-25 01:37:35

相关问题