Prathap Gangireddy Ответов: 1

Код валюты Sql server, если счет-фактура содержит более одной валюты


Ниже приведено мое требование
Table1 - QuotationMaster - QuoteID,CustomerID,Date,InvoiceNo
Table2 - QuoteItems - QuoteID,ItemID,CurrencyID,Amount
Table3 - CurrencyMaster - CurrencyID,CurrencyCode

Пример -

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

Дата,Имя Пользователя,Код Валюты,Сумма

Для конкретного счета если он имеет 2 позиции с одинаковым идентификатором CurrencyID то результат должен отображаться следующим образом
Item1 - Amount (2.00) 
Item2 - Amount (3.00)

Date   InvoiceNo  CustomerName    CurrencyCode   Amount
June    INV123     TESTING          INR           5.00
Для конкретного счета-фактуры, если он имеет 2 позиции, которые имеют разные CurrencyID, то результат должен отображаться следующим образом
followDate   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


Не могли бы вы помочь мне с подходом

Что я уже пробовал:

Я не могу получить четкую картину того, как решить эту проблему, так как в конечном итоге получаю groupby currencyid и получаю один и тот же результат, напечатанный дважды

Maciej Los

Зачем вам такая функциональность? В этом нет никакого смысла!

1 Ответов

Рейтинг:
2

CHill60

Я согласен с Мацеем, что это не имеет особого смысла. В реальном мире вам либо нужно иметь дело с мультивалютными счетами (и получать деньги!) Или вообще не допустить мультивалютного сценария.

Однако вы можете получить подсчет количества валют, используемых в каждом счете-фактуре, следующим образом

select InvoiceNo, count(distinct currencyID) as CurrCount
FROM  QuotationMaster A 
INNER JOIN QuoteItems B ON A.QuoteID = B.QuoteID GROUP BY InvoiceNo
Вы можете использовать этот фрагмент в CTE для подачи в ваш основной запрос например
;with NoCurrs as
(
	-- count the number of currencies used on each Invoice
	select InvoiceNo, count(distinct currencyID) as CurrCount
	FROM  QuotationMaster A 
	INNER JOIN QuoteItems B ON A.QuoteID = B.QuoteID GROUP BY InvoiceNo
)
SELECT A.QuoteID, datename(m,[Date]), A.InvoiceNo, CustomerId, 
Currency = CASE WHEN N.CurrCount = 1 THEN MAX(CurrencyCode) ELSE '' END,
Amount = CASE WHEN N.CurrCount = 1 THEN SUM(Amount) ELSE 0.00 END
FROM NoCurrs N 
INNER JOIN QuotationMaster A ON A.InvoiceNo = N.InvoiceNo
INNER JOIN QuoteItems B ON A.QuoteID = B.QuoteID
INNER JOIN CurrencyMaster C ON B.CurrencyID = C.CurrencyID
GROUP BY A.QuoteID, datename(m,[Date]), A.InvoiceNo, CustomerId,CurrCount

Моменты, которые следует отметить:
- Спот использование кейса, чтобы определить, нужна ли мне валюта и сумма
- Я использовал MAX(CurrencyCode) только для обработки сценария "group by" (т. е. мне нужна была какая-то функция там)
- Я не присоединился к другим таблицам, чтобы получить такие вещи, как имя клиента - это для вас, чтобы добавить.
- Вы могли бы использовать вместо этого подзапрос, мне просто нравится CTE