Код валюты сервера SQL, если в счете-фактуре одна валюта - PullRequest
0 голосов
/ 28 июня 2018

ниже мое требование

Table1 - QuotationMaster - QuoteID,CustomerID,Date,InvoiceNo
Table2 - QuoteItems - QuoteID,ItemID,CurrencyID,Amount
Table3 - CurrencyMaster - CurrencyID,CurrencyCode

Пример -

Если я ищу выписку по счету на определенную дату, конечный результат должен быть

Дата, CustomerName, CurrencyCode, сумма

Для определенного счета-фактуры, если он имеет 2 позиции с одинаковым CurrencyID тогда результат должен отображаться следующим образом

Item1 - Сумма (2,00) Item2 - Сумма (3,00)

Date   InvoiceNo  CustomerName    CurrencyCode   Amount
June    INV123     TESTING          INR           5.00

Для определенного счета-фактуры, если он имеет 2 позиции, которые имеют разные 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 голосов
/ 28 июня 2018

Вы можете попробовать это:

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.
0 голосов
/ 28 июня 2018

Когда я понимаю это право, вы в основном хотите сгруппировать элементы по quoteid и отфильтровать те, где максимальный currencyid не равен минимальному currencyid в предложении HAVING. (Если все идентификаторы валют равны, минимальный равен максимальному.)

Затем присоедините его к таблице котировок слева и присоединитесь к таблице валют, чтобы получить код.

Проверка в случае, если идентификатор валюты IS NULL. Если это так, то элементы котировки имели разные идентификаторы валют (или все они были NULL, что означает, что они были разными, по логике трех состояний).

Поскольку вы не описали свою таблицу клиентов, имя клиента не выбрано. Вам придется добавить это самостоятельно.

SELECT qm1.date,
       qm1.invoiceno,
       CASE
         WHEN qi2.quoteid IS NULL
           THEN cm1.currencycode
         ELSE
           '0'
       END currencycode,
       CASE
         WHEN qi2.quoteid IS NULL
           THEN qi2.amount
         ELSE
           0
       END amount
       FROM quotationmaster qm1
            LEFT JOIN (SELECT qi1.quoteid,
                              sum(qi1.amount) amount,
                              max(qi1.currencyid) currencyid
                              FROM quoteitems qi1
                              GROUP BY qi1.quoteid
                              HAVING max(qi1.currencyid) = min(qi1.currencyid)) qi2
                      ON qi2.quoteid = qm1.quoteid
            LEFT JOIN currencymaster cm1
                      ON cm1.currencyid = cm1.qurrencyid;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...