以下是我的要求
Table1 - QuotationMaster - QuoteID,CustomerID,Date,InvoiceNo
Table2 - QuoteItems - QuoteID,ItemID,CurrencyID,Amount
Table3 - CurrencyMaster - CurrencyID,CurrencyCode
示例-
如果我搜索特定日期的发票对帐单,则最终结果必须为
日期,客户名称,货币代码,金额
对于特定发票,如果它有2个项目具有相同的CurrencyID 然后结果应显示为
第1项-金额(2.00) 第2项-金额(3.00)
Date InvoiceNo CustomerName CurrencyCode Amount
June INV123 TESTING INR 5.00
对于一个特定的发票,如果它有两个具有不同的CurrencyID的项目 然后结果应显示如下
Date InvoiceNo CustomerName CurrencyCode Amount
June INV123 TESTING 0 0.00
为简单起见,如果发票中有两个币种不同,则货币代码和金额必须为0。
我无法清晰地看到如何解决此问题,因为我遇到了groupby currencyid并获得了两次打印相同结果的结果
Date InvoiceNo CustomerName CurrencyCode Amount
June INV123 TESTING INR 2.00
June INV123 TESTING GBP 3.00
您能帮我解决吗
答案 0 :(得分:0)
当我了解这项权利时,您基本上希望将这些项目按quoteid
进行分组,并筛选出{{1}中最大值currencyid
不等于最小值currencyid
的项目}}子句。 (如果所有货币ID都相等,则最小值等于最大值。)
然后将其加入报价表,然后将其加入货币表以获取代码。
检查是否输入了货币ID HAVING
。如果是,则报价的项目具有不同的货币ID(或全部为IS NULL
,根据三态逻辑,这意味着它们是不同的)。
由于您没有描述客户表,所以未选择客户名称。您必须自己添加。
NULL
答案 1 :(得分:0)
您可以尝试以下方法:
SELECT sub.QuoteID,
sub.CustomerID,
sub.Date,
sub.InvoiceNo,
sub.ItemID,
IIF(sub.ItemCount = sub.CurrencyCount, sub.CurrencyID, 0) AS CurrencyID
sub.Amount,
FROM (
SELECT qm.QuoteID,
qm.CustomerID,
qm.Date,
qm.InvoiceNo,
qi.ItemID,
qi.CurrencyID,
qi.Amount,
COUNT(*) OVER (PARTITION BY qi.QuoteID) AS ItemCount,
COUNT(*) OVER (PARTITION BY qi.QuoteID, qi.CurrencyID) AS CurrencyCount
FROM QuotationMaster AS qm
INNER JOIN QuoteItems AS qi
ON qi.QuoteID = qm.QuoteID
) AS sub
-- You can use it also for a join (a 'n/a'-Currency in CurrencyMaster with ID=0 is required)
-- INNER JOIN CurrencyMaster AS cm
-- ON cm.CurrencyID = IIF(sub.ItemCount = sub.CurrencyCount, sub.CurrencyID, 0)
-- OR Use LEFT OUTER JOIN if you dont have a Fallback-Value in CurrencyMaster.