SQL Server货币代码(如果发票具有一种以上一种货币)

时间:2018-06-28 11:21:22

标签: sql sql-server sql-server-2008

以下是我的要求

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

您能帮我解决吗

2 个答案:

答案 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.