Bazı arka plan hikayesi: A firması bir sorun kazananlara kuponları verir. Şu anda ihtiyaçları yazıyorum SQL değerine toplamlar bir kişiye verilen gerektiriyordu kupon mezhep karar vermek. Ben kuponları için kullanılabilir depolar mezhepler, ülke ve para birimine bağlı olduğunu bir tablo var.
Aşağıdaki örnekte, bir kişinin kuponları € 80 değerinde ile verilir.
belirli bir ülke için geçerli kupon mezhepleri için bir arama tablosu görüntüler sonuçlarının altında sorgusu.
SELECT * FROM tblDenominationScheme WHERE CountryCode IN ('AT', 'US')
Sonuç:
No. | CountryCode | VoucherName | VoucherValue
-------------------------------------------------
1 | AT | €50 Shop A | 50
2 | AT | €25 Shop A | 25
3 | AT | €15 Shop A | 15
4 | AT | €10 Shop A | 10
5 | US | $50 Store B | 50
6 | US | $10 Store B | 10
7 | US | $5 Store B | 5
Benim şu anki SQL € 80 kuponu için gerekli kupon mezhepleri belirlemek için aşağıda gibidir:
DECLARE @CountryCode1 VARCHAR(2) = 'AT'
DECLARE @ChallengerID INT = 1172
DECLARE @RoundedAmount1 INT = 80
DECLARE @Vouchers INT
DECLARE @AmountAwarded INT = 0
SET @AmountAwarded = @RoundedAmount1
DROP TABLE IF EXISTS #tempVoucher
CREATE TABLE #tempVoucher
(
CountryCode VARCHAR(2),
ChallengerID INT,
AmountAwarded INT,
Vouchers INT,
)
WHILE (@RoundedAmount1 > 0)
BEGIN
SET @Vouchers = 0
SELECT TOP 1 @Vouchers = VoucherValue FROM tblDenominationScheme WHERE CountryCode = @CountryCode1 AND VoucherValue <= @RoundedAmount1 ORDER BY VoucherValue DESC
IF (@Vouchers > 0)
BEGIN
SET @RoundedAmount1 = @RoundedAmount1 - @Vouchers
END
ELSE
BEGIN
SELECT TOP 1 @Vouchers = VoucherValue FROM tblDenominationScheme WHERE CountryCode = @CountryCode1 ORDER BY VoucherValue
SET @RoundedAmount1 = @RoundedAmount1 - @RoundedAmount1
END
INSERT INTO #tempVoucher VALUES (@CountryCode1,@ChallengerID, @AmountAwarded, @Vouchers)
END
SELECT * FROM #tempVoucher
SQL yukarıdan Sonuç:
No. | CountryCode | ChallengerID | AmountAwarded | Vouchers
--------------------------------------------------------------
1 | AT | 1172 | 80 | 50
2 | AT | 1172 | 80 | 25
3 | AT | 1172 | 80 | 10
NOT: AmountAwarded sütunundaki değer tüm 3 satırlar için aynı olacaktır. 3 satır için Fişler sütunundaki miktarı 80 özetlemek gerekir.
Eğer Kuponlar sütundaki değerleri Özetle, eğer 5 daha AmountAwarded daha uzun olduğu, Kim 85 verir, çünkü, yukarıda sonuç açıkça yanlış
Beklenen sonuç (veya en yakın en azından):
No. | CountryCode | ChallengerID | AmountAwarded | Vouchers
--------------------------------------------------------------
1 | AT | 1172 | 80 | 50
2 | AT | 1172 | 80 | 10
3 | AT | 1172 | 80 | 10
4 | AT | 1172 | 80 | 10
yardım edebilmek isteyen?