私は「複雑な」クエリと呼ばれるものを作成することは私の目標にはないという免責事項を前にして説明します。たいていの場合、私が達成しようとしていることを達成するための方がはるかに単純な方法があります。下のクエリが最高ではない場合、私はお詫び申し上げます。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)
質問は何ですか? –
更新の前後に、より簡単な例、表構造の表示、およびサンプルデータを作成してください。 –
私は、サンプルを投稿せずに必要なものを正確に伝える方法を完全にはわかりませんでした。いくつかのサンプルデータを入力しようとしていましたが、ありがたいことに@ jim31415が私を助けました。このポストを見ていただきありがとうございます! – ajtatum