1

注文のリストがあります

注文

OrderID     CustomerID      ProductID
-------------------------------------
1           32              15
2           16              28
3           7               20
4           32              16

およびこれらの注文に適用する必要がある料金のリスト

料金

ChargeID    CustomerID      ProductID   Charge  Desc
--------------------------------------------------------------------
1           32              0           8.99    Basic Cost Per Order
2           32              15          10.05   Subcharge: Delivery
3           16              28          8.99    Basic Cost Per Order
4           16              0           16.05   Subcharge: Delivery
5           7               20          17.99   Basic Cost Per Order

ノート:

charges、の場合はProductID = 0、すべての商品に料金がかかることを意味します。

例えば

  • 料金1-お客様328.99のすべてに適用されますProducts
  • 料金2-顧客32の10.05製品にのみ適用されますID=15

したがって、顧客32のProductIDが見つからないため
OrderID = 4サブチャージ配信は行われません。

質問は:これらの注文の見積もりをテーブル
に記入するにはどうすればよいですか?@tempQuote

したがって、この場合に必要な結果セットは次のようになります。

OrderID ChargeID
--------------------
1       1
1       2   
2       3           
2       4
3       5
4       1

問題は、 OrderIDをテーブルに単純に挿入して@tempQuotesから料金を適用できないことです。これは、複数の料金が発生する可能性があり、エラーが発生するためです。

サブクエリは複数の値を返しました。サブクエリが=、!=、<、<=、>>、> =の後に続く場合、またはサブクエリが式として使用される場合、これは許可されません。

金メダルは、次のような手段があれば明らかになります。複数の請求がある場合は、複数の請求ごとにorderid / ChargeIDをテーブルに挿入します。たとえば、行が1つしかない場合、または複数の請求がある場合は@tempQuotes、テーブルを更新します。@tempQuotes各注文/請求を挿入するか、適用されるすべての請求IDを追加の列に保存します@tempQuotes

OrderID, ChargeID
1        1,2

たとえばのように料金を更新するのとは対照的に

 Insert into @tempQuotes(OrderID)
select OrderID from #Orders

Update  t
set ChargeID = (Select #Charges.ChargeID from @tempQuotes t
inner join #Orders on t.OrderID = #Orders.OrderID
inner join #Charges on #Orders.CustomerID = #Orders.CustomerID)
from @tempQuotes t

select * from @tempQuotes

テーブルの設定:

IF OBJECT_ID('tempdb..#Orders') IS NOT NULL
BEGIN
drop table #Orders
END

IF OBJECT_ID('tempdb..#Charges') IS NOT NULL
BEGIN
drop table #Charges
END


create table #Orders(
OrderID int identity(1,1),
CustomerID int,
ProductID int,
)
Insert into #Orders(CustomerID,ProductID) values (32,15)
Insert into #Orders(CustomerID,ProductID) values (16,28)
Insert into #Orders(CustomerID,ProductID) values (7,20)
Insert into #Orders(CustomerID,ProductID) values (32,16)


create table #Charges(
ChargeID int identity(1,1),
CustomerID int,
ProductID int,
Charge     decimal(10,2),
[Desc]     nvarchar(50),
) 
Insert into #Charges(CustomerID,ProductID,Charge,[Desc]) values (32,    0,  8.99,   'Basic Cost Per Order')
Insert into #Charges(CustomerID,ProductID,Charge,[Desc]) values (32,    15, 10.05,  'Subcharge: Delivery')
Insert into #Charges(CustomerID,ProductID,Charge,[Desc]) values (16,    28, 8.99,   'Basic Cost Per Order')
Insert into #Charges(CustomerID,ProductID,Charge,[Desc]) values (16,    0,  16.05,  'Subcharge: Delivery')
Insert into #Charges(CustomerID,ProductID,Charge,[Desc]) values (7, 20, 17.99, 'Basic Cost Per Order')

declare @tempQuote table(
OrderID int,
ChargeID int

)。

declare @tempQuote table(
OrderID int,
ChargeID int
)
4

1 に答える 1

2

これは機能するはずです:

SELECT O.OrderId, C.ChargeId
FROM Orders O
  JOIN Charges C ON O.CustomerId = C.CustomerId AND
    (C.ProductId = O.ProductId OR C.ProductId = 0)
ORDER BY O.OrderId, C.ChargeId

これがサンプルのフィドルです。

そしてそれはこれらの結果を生み出します:

ORDERID   CHARGEID
1         1
1         2
2         3
2         4
3         5
4         1
于 2013-02-19T16:10:10.987 に答える