Я собираюсь предвосхитить этот вопрос отказом от ответственности, что создание того, что я называю «сложными» запросами, не является моей сильной стороной. В большинстве случаев есть гораздо более простой способ выполнить то, что я пытаюсь выполнить, поэтому, если приведенный ниже запрос не соответствует требованиям, я приношу свои извинения.
С учетом вышесказанного у меня есть таблица, которая отслеживает счета-фактуры поставщика и позиции счета-фактуры поставщика (вместе с типом счета-фактуры поставщика и типом счета-фактуры поставщика). Наш бухгалтер хочет получить отчет, который просто показывает: Vendor | Расположение | Инв Номер | Инв Тип | Тип изделия | Инв Дата | Арендная плата | Restock Fee | Стоимость доставки | Стоимость позиции | Итого (позиция + сборы)
В большинстве случаев один счет-фактура поставщика составляет одну строку. Однако есть исключения, когда в счете-фактуре поставщика может быть много типов элементов, что создает две строки. Ничего страшного, за исключением сборов (аренда, пополнение запасов, доставка), прикрепленных к таблице счетов поставщиков. Итак, я сначала создал запрос, который проверяет временную таблицу для счетов-фактур, которые имеют несколько строк, берет последнюю строку и обнуляет комиссионные. Так что только одна позиция будет иметь плату. Однако нашему бухгалтеру это не нравится. Вместо этого она хотела бы, чтобы сборы были «распределены» между позициями.
Таким образом, если в счете-фактуре поставщика стоимость доставки составляет 25 долларов США, а две позиции равны, то каждая позиция составит 12,50 доллара США.
После работы с запросом я получил его, чтобы обновить Последнюю строку, чтобы она была скорректированной суммой, но строка 1+ будет иметь исходную сумму.
Я собираюсь опубликовать весь свой запрос здесь (опять же - извините, это может быть не самый привлекательный запрос, однако предложения всегда приветствуются)
DROP TABLE #tVendorInvoiceReport
DROP TABLE #tSummary
SELECT v.Name AS Vendor ,
vii.Location ,
vi.VendorInvNumber ,
vit.Descr AS InvoiceType ,
vii.VendorInvoiceItemType ,
CONVERT(VARCHAR(10), vi.VendorInvDate, 120) VendorInvDate ,
vi.RentalFee ,
vi.RestockFee ,
vi.ShippingFee ,
SUM(vii.TotalUnitCost) TotalItemCost ,
CONVERT(MONEY, 0) TotalInvoice ,
RowID = IDENTITY( INT,1,1)
INTO #tVendorInvoiceReport
FROM dbo.vVendorInvoiceItems AS vii
JOIN dbo.VendorInvoices AS vi ON vii.VendorInvID = vi.VendorInvID
JOIN dbo.Vendors AS v ON vi.VendorID = v.VendorID
JOIN dbo.VendorInvoiceTypes AS vit ON vi.VendorInvTypeID = vit.VendorInvTypeID
WHERE vi.VendorInvDate >= '2012-01-01'
AND vi.VendorInvDate <= '2012-01-31'
GROUP BY v.Name ,
vii.Location ,
vi.VendorInvNumber ,
vit.Descr ,
vii.VendorInvoiceItemType ,
CONVERT(VARCHAR(10), vi.VendorInvDate, 120) ,
vi.RentalFee ,
vi.RestockFee ,
vi.ShippingFee
ORDER BY v.Name ,
vii.Location ,
vi.VendorInvNumber ,
vit.Descr ,
vii.VendorInvoiceItemType ,
CONVERT(VARCHAR(10), vi.VendorInvDate, 120)
SELECT VendorInvNumber ,
COUNT(RowID) TotalLines ,
MAX(RowID) LastLine
INTO #tSummary
FROM #tVendorInvoiceReport
GROUP BY VendorInvNumber
WHILE ( SELECT COUNT(LastLine)
FROM #tSummary AS ts
WHERE TotalLines > 1
) > 0
BEGIN
DECLARE @LastLine INT
DECLARE @NumItems INT
SET @LastLine = ( SELECT MAX(LastLine)
FROM #tSummary AS ts
WHERE TotalLines > 1
)
SET @NumItems = ( SELECT COUNT(VendorInvNumber)
FROM #tVendorInvoiceReport
WHERE VendorInvNumber IN (
SELECT VendorInvNumber
FROM #tSummary
WHERE LastLine = @LastLine )
)
UPDATE #tVendorInvoiceReport
SET RentalFee = ( RentalFee / @NumItems ) ,
RestockFee = ( RestockFee / @NumItems ) ,
ShippingFee = ( ShippingFee / @NumItems )
WHERE RowID = @LastLine
DELETE FROM #tSummary
WHERE LastLine = @LastLine
--PRINT @NumItems
END
UPDATE #tVendorInvoiceReport
SET TotalInvoice = ( TotalItemCost + RentalFee + RestockFee + ShippingFee )
SELECT Vendor ,
Location ,
VendorInvNumber ,
InvoiceType ,
VendorInvoiceItemType ,
VendorInvDate ,
RentalFee ,
RestockFee ,
ShippingFee ,
TotalItemCost ,
TotalInvoice
FROM #tVendorInvoiceReport AS tvir
Я искренне ценю любого, кто нашел время, чтобы прочитать это и попытаться указать мне правильное направление.
Спасибо,
Andrew
PS - я попытался удалить «WHERE RowID = @LastLine» из первого обновления, но это изменило стоимость доставки для первой строки с двумя элементами на «0,0868» вместо 12,50 (25/2 $)