我有一个复杂的查询要写,但无法弄明白
这是我的表格
销售 - 系统中每笔销售的一行
SaleProducts - 发票中每行的一行(类似于NW中的OrderDetails)
交易 - 销售可能有权获得的可能交易/优惠清单
DealProducts - 为获得交易必须购买的产品数量列表
现在我试图提出一个查询,告诉我每次销售他可能得到的交易
相关领域是:
销售:SaleID(PK)
销售产品:SaleID(FK),产品ID(FK)
交易:DealID(PK)
DealProducts:DealID(FK),ProductID(FK),Mandatories(int)所需数量
我相信我应该可以使用某种交叉连接或外连接,但它不起作用
这是一个样本(我试过的约30件事)
SELECT DealProducts.DealID, DealProducts.ProductID, DealProducts.Mandatories,
viwSaleProductCount.SaleID, viwSaleProductCount.ProductCount
FROM DealProducts
LEFT OUTER JOIN viwSaleProductCount
ON DealProducts.ProductID = viwSaleProductCount.ProductID
GROUP BY DealProducts.DealID, DealProducts.ProductID, DealProducts.Mandatories,
viwSaleProductCount.SaleID, viwSaleProductCount.ProductCount
问题是它没有显示任何未满足的产品交易(可能是因为ProductID连接)。我还需要显示没有要求的销售,然后我可以过滤掉此查询中存在的任何SaleID where AmountBought < Mandatories
等
感谢您的帮助
答案 0 :(得分:1)
我不确定我对你的问题有多好(viwSaleProductCount适合哪里?)但听起来你需要一个外部联接到一个子查询,它返回一个交易列表及其相关产品。我认为它会是这样的:
Select *
From Sales s Inner Join SaleProducts sp on s.SaleID = sp.SaleID
Left Join (
Select *
From Deals d Inner Join DealProducts dp on d.DealID = dp.DealId
) as sub on sp.ProductID = sub.ProductID
您可能需要添加逻辑以确保交易不会出现两次,当然会将*替换为您在所有情况下都需要的特定列名。
编辑:如果您实际上不需要销售或交易表中的任何信息,可以使用以下内容:
Select sp.SaleID, sp.ProductID, sp.ProductCount, dp.DealID, dp.Mandatories
From SaleProducts sp
Left Join DealProducts as dp on sp.ProductID = dp.ProductID
如果您需要对此结果进行分组/汇总,则需要小心确保特定销售不会多次计算交易(Count Distinct可能是合适的,具体取决于您的分组)。因为它是一个左连接,所以您不必担心排除在DealProducts中没有匹配的销售。