【问题标题】:SQL Syntax for Complex Scenario (Deals)复杂场景的 SQL 语法(交易)
【发布时间】:2010-06-07 13:09:04
【问题描述】:

我有一个复杂的查询要写,但无法弄清楚

这是我的桌子

销售 -- 系统中的每笔销售都有一行
SaleProducts -- 发票中的每一行都有一行(类似于 NW 中的 OrderDetails)
交易 -- 销售可能有权获得的可能交易/优惠列表
DealProducts -- 为达成交易而必须购买的产品数量列表

现在我正在尝试进行查询,该查询将告诉我每次销售他可能会获得哪些交易

相关字段为:

销售:SaleID (PK)
SaleProducts:SaleID (FK)、ProductID (FK)
优惠:DealID (PK)
DealProducts: DealID(FK), ProductID(FK), Mandatories (int) for required qty

我相信我应该能够使用某种交叉连接或外连接,但它不起作用

这是一个示例(我尝试了大约 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

感谢您的帮助

【问题讨论】:

    标签: sql join


    【解决方案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 可能合适,具体取决于您的分组)。因为它是 Left Join,所以您无需担心排除在 DealProducts 中不匹配的销售。

    【讨论】:

    • 您好,感谢您这么快的回答!我相信您的查询在功能上等同于 SELECT sp.SaleID, sp.ProductID, sp.ProductCount, dp.DealID, dp.ProductID AS Expr1, dp.Mandatories FROM (SELECT SaleID, ProductID, COUNT(SaleProductID) AS ProductCount FROM SaleProducts GROUP BY ProductID, SaleID) AS sp LEFT OUTER JOIN (SELECT DealID, ProductID, Mandatories FROM DealProducts) AS dp ON sp.ProductID = dp.ProductID ill continue in next comment(这些 r so short)
    • 它们返回相同数量的行。销售表和交易表现在没有任何重要信息 4 我们。所以他们可以被排除在外。现在这还有一个缺点。如果我有一个 DealProduct 行,可以说 DealID=5,ProductID=7。现在,如果某个特定的销售(比如说 id=1)没有任何 Productid=7 的 SaleProducts,那么它就不会出现在这个查询中,而且我永远不会知道 saleid 不符合交易 ID 5
    • 如果您的加入正确组合,那么销售将显示并且交易信息将为空。让我看看我是否可以根据您正在寻找的内容拼凑一个更新的查询。
    • 感谢 alex 您发布的查询,再次只带来有 productcount 的行,这意味着该产品中至少有 1 个在销售中。但是为了弄清楚是否符合条件,我们还需要查看mandatories=3 和productcount = 0 的行。然后我们可以检查是否所有的mandatories r 都满足了。等待你的新“鹅卵石”查询 :-) 谢谢
    • 嗯,你说你不需要销售表中的任何东西 - 但听起来你可能需要(如果你需要没有任何产品的销售,你肯定不会从SaleProducts 表)。左连接不会排除任何不匹配的内容。您是否在我上面发布的第二个查询中添加了 where 子句或任何内容?如果没有,我认为您需要发布示例数据(最好以可以创建/填充临时表的脚本形式)和预期结果,因为我们似乎正在经历某种脱节。
    猜你喜欢
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多