2012-02-14 10 views
0

私は「複雑な」クエリと呼ばれるものを作成することは私の目標にはないという免責事項を前にして説明します。たいていの場合、私が達成しようとしていることを達成するための方がはるかに単純な方法があります。下のクエリが最高ではない場合、私はお詫び申し上げます。SQLクエリを作成して広告申込情報の金額を更新する際に問題が発生する

これは、ベンダー請求書と仕入先請求書明細(仕入先請求書タイプと仕入先請求書アイテムタイプとともに)を記録したテーブルがあります。私たちの簿記担当者は、単に次のようなレポートを望んでいます。ロケーション| Inv番号| Invタイプ|アイテムタイプ| Inv Date |レンタル料|レシートフィー|送料| |ラインアイテムコスト|合計(広告申込情報+料金)

ほとんどの場合、1つのベンダー請求書は1行です。ただし、仕入先請求書には多くの明細タイプがあり、2行が作成されるという例外があります。大きな違いはありません。手数料(レンタル、再入荷、配送)がベンダー請求書テーブルに添付されている場合を除きます。だから、私は最初に、複数の行を持つ請求書のテンポラリ・テーブルをチェックし、最後の行を取り、料金をゼロにするクエリを作成しました。そのため、1つの広告申込情報で料金が発生します。しかし、私たちの簿記者はそれを好まない。代わりに、広告申込情報に料金が「配信」されるようにしたいと考えています。

したがって、仕入先請求書に25ドルの送料があり、2つの広告申込情報がある場合、各広告申込情報は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 

私は心から誰誰に感謝これを読んで、正しい方向に私を向けることを試みる時間がかかりました。私は「WHEREのRowID = @LastLine」最初の更新から試してみて、削除しましたが、それは二つのアイテムの代わりに「0.0868」との最初の行のための船積み料金を変更 -

はアンドリュー

はPS、 をありがとう12.50($ 25/2)

+0

質問は何ですか? –

+0

更新の前後に、より簡単な例、表構造の表示、およびサンプルデータを作成してください。 –

+0

私は、サンプルを投稿せずに必要なものを正確に伝える方法を完全にはわかりませんでした。いくつかのサンプルデータを入力しようとしていましたが、ありがたいことに@ jim31415が私を助けました。このポストを見ていただきありがとうございます! – ajtatum

答えて

1

私が正しく理解していれば、1つ以上の請求書明細に対して請求書発送料のようなものを分割する方法を探しています。

以下に示すサンプル請求書および請求書明細テーブルを作成し、 over(partition) clauseを使用して明細ごとの出荷を分割しました。

-- 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 
+0

あなたは紳士で学者です。私は私の質問が最も明確ではなかったことを知っています。テーブル構造やデータセットを定義していませんでしたが、スタックオーバーフローは単なる信じられないほどのリソースです。私はあなたのロジックを私のクエリに実装し、それは美しく動作します。さらに、あなたは私に新しい機能を教えてくれました。ありがとうございました。 – ajtatum

関連する問題