Проблема при создании SQL-запроса для обновления количества позиций - PullRequest
0 голосов
/ 15 февраля 2012

Я собираюсь предвосхитить этот вопрос отказом от ответственности, что создание того, что я называю «сложными» запросами, не является моей сильной стороной. В большинстве случаев есть гораздо более простой способ выполнить то, что я пытаюсь выполнить, поэтому, если приведенный ниже запрос не соответствует требованиям, я приношу свои извинения.

С учетом вышесказанного у меня есть таблица, которая отслеживает счета-фактуры поставщика и позиции счета-фактуры поставщика (вместе с типом счета-фактуры поставщика и типом счета-фактуры поставщика). Наш бухгалтер хочет получить отчет, который просто показывает: 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 $)

1 Ответ

1 голос
/ 15 февраля 2012

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

Я создал несколько образцов таблиц счетов-фактур и счетов-фактур, показанных ниже, и использовал более (раздел) пункт , чтобы разделить доставку на единицу.

-- sample tables
declare @Invoice table (InvoiceID int, customerID int, Date datetime, ShippingFee float)
declare @InvoiceItem table (InvoiceItemID int identity, InvoiceID int, ItemDesc varchar(50), Quantity float, ItemPrice float)

-- Example 1
insert @Invoice values(1, 800, getdate(), 20);
insert @InvoiceItem values(1, 'Widget', 1, 10.00)
insert @InvoiceItem values(1, 'Wing Nut', 5, 2.00)
insert @InvoiceItem values(1, 'Doodad', 8, 0.50)
insert @InvoiceItem values(1, 'Thingy', 3, 1.00)

-- Example 2
insert @Invoice values(2, 815, getdate(), 15);
insert @InvoiceItem values(2, 'Green Stuff', 10, 1.00)
insert @InvoiceItem values(2, 'Blue Stuff', 10, 1.60)

-- Example 3
insert @Invoice values(3, 789, getdate(), 15);
insert @InvoiceItem values(3, 'Widget', 10, 1.60)

-- query
select 
    n.InvoiceID,
    n.InvoiceItemID,
    n.ItemDesc,
    n.Quantity,
    n.ItemPrice,
    ExtendedPrice = n.Quantity *    n.ItemPrice,
    Shipping = i.ShippingFee / count(n.InvoiceItemID) over(partition by n.InvoiceID)
from @InvoiceItem n
    join @Invoice i on i.InvoiceID = n.InvoiceID

Выход:

    InvoiceID   InvoiceItemID   ItemDesc    Quantity    ItemPrice   ExtendedPrice   Shipping
    1           1               Widget      1           10          10                  5
    1           2               Wing Nut    5           2           10                  5
    1           3               Doodad      8           0.5         4                   5
    1           4               Thingy      3           1           3                   5

    2           5               Green Stuff 10          1           10                  7.5
    2           6               Blue Stuff  10          1.6         16                  7.5

    3           7               Widget      10          1.6         16                  15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...