注意:我已经尝试简化以下内容,使我和其他任何人都能理解它更简单,我在下面引用的表实际上是从不同来源将大量不同数据连接在一起的子查询)
我有一张购买物品的表格:
项
ItemSaleID CustomerID ItemCode
1 100 A
2 100 B
3 100 C
4 200 A
5 200 C
我还有来自系统的事务标题和详细信息表:
TranDetail
TranDetailID TranHeaderID ItemSaleID Cost
11 51 1 $10
12 51 2 $10
13 51 3 $10
14 52 4 $20
15 52 5 $10
TranHeader
TranHeaderID CustomerID Payment Time
51 100 $100 11:00
52 200 $50 12:00
53 100 $20 13:00
我希望得到一个像我这样的表的地方:
ItemSaleID CustomerID ItemCode Cost Payment Time
1 100 A $10 $120 11:00
2 100 B $10 11:00
3 100 C $10 11:00
4 200 D $20 $50 12:00
5 200 E $10 12:00
我有一个产生结果的查询但是当我添加ROW_NUMBER()
case语句时,从2分钟到30多分钟。
查询进一步混淆,因为我需要提供与交易清单和支付的总价格相关的最早日期(可能是全天的许多交易进行升级等)
以下查询:
SELECT ItemSaleID
, CustomerID
, ItemCode
, Cost
, CASE WHEN ROW_NUMBER() OVER (PARTITION BY TranHeaderID ORDER BY ItemSaleID) = 1
THEN TRN.Payment ELSE NULL END AS Payment
FROM Items I
OUTER APPLY (
SELECT TOP 1 SUB.Payment, Time
FROM TranHeader H
INNER JOIN TranDetail D ON H.TranHeaderID = D.TranHeaderID
OUTER APPLY (SELECT SUM(Payment) AS Payment
FROM TranHeader H2
WHERE H2.CustomerID = Items.CustomerID
) SUB
WHERE D.CustomerID = I.CustomerID
) TRN
WHERE ...
我是否只能在保持性能的同时显示每次出现的客户ID付款