【问题标题】:Query Total Amounts for Orders where the amount of each item was greater than >100查询单项金额大于>100的订单总金额
【发布时间】:2010-06-23 16:06:08
【问题描述】:

使用 SQL Server 2005 上的以下两个表,我将如何编写查询以返回任何订单的任何订单行项目金额 (OD_Amount) 大于 100 的订单的 First_Name、Last_Name、Order_Date 和总金额。

订单

Order_ID
First_Name
Last_Name
Order_Date

Order_Details

Order_Detail_ID
Order_ID
OD_Item_No
OD_Amount

【问题讨论】:

  • 所以澄清一下 - 你想包括所有订单(包括所有项目),其中任何一个项目大于 100?并排除所有其他项(例如,总订单可能 > 100,但单个项目全部

标签: sql sql-server tsql group-by


【解决方案1】:

可能是这样的吗?

Select 
  t1.Order_ID, First_Name, Last_Name, Order_Date, Sum(OD_Amount) as Order_Total
From
  Orders t1
Inner Join
  Order_Details t2
    on t1.Order_ID = t2.Order_ID
Where 
  t1.Order_Id in (Select Distinct Order_Id from Order_Details where OD_Amount > 100)
Group By
  t1.Order_ID, First_Name, Last_Name, Order_Date

【讨论】:

    【解决方案2】:
    SELECT
        O.first_name,
        O.last_name,
        O.order_date,
        SUM(OD.amount)
    FROM
        Orders O
    INNER JOIN Order_Details OD ON OD.order_id = O.order_id
    WHERE EXISTS
    (
        SELECT
        FROM
            Order_Details OD2
        WHERE
            OD2.order_id = O.order_id AND
            OD2.amount > 100
    )
    GROUP BY
        O.first_name,
        O.last_name,
        O.order_date
    

    【讨论】:

    • 引用 OP:“..where 任何订单行项目金额对于任何订单 (OD_Amount) 都大于 100...”
    • 是的,这可能意味着任何一个大于 100 或(我如何解释)它可能意味着选择其中任何一个,它会大于 100。这就是样本数据和预期结果的原因很有用:)
    • 订购的任何一件商品都大于 100 是我一直在寻找的。因此,排除订单中商品不超过 100 的任何订单。这说明清楚了吗?
    • 我已将其更改为匹配
    【解决方案3】:

    此时您希望每个单独的明细订单大于 100

    SELECT t1.First_Name, t1.Last_Name, t1.Order_Date, SUM(t2.OD_Amount) AS 'totalAmount'
    FROM Orders AS t1
    JOIN Order_Details AS t2 ON t1.Order_ID = t2.Order_ID
    WHERE t2.OD_Amount > 100
    GROUP BY t1.First_Name, t1.Last_Name, t1.Order_Date
    

    如果您希望每个订单本身超过 100,那么:

    SELECT t1.First_Name, t1.Last_Name, t1.Order_Date, SUM(t2.OD_Amount) AS 'totalAmount'
    FROM Orders AS t1
    JOIN Order_Details AS t2 ON t1.Order_ID = t2.Order_ID    
    GROUP BY t1.First_Name, t1.Last_Name, t1.Order_Date
    HAVING SUM(t2.OD_Amount) > 100
    

    【讨论】:

    • 这也会从 SUM() 中删除金额
    • 你不能在 WHERE 中有聚合——需要在 HAVING 子句中。
    【解决方案4】:

    我相信这就是您要找的:

    SELECT o.First_Name, o.Last_Name, sum(od.OD_Amount) As Order_Total_Amount FROM Order_Details AS od, Orders AS o WHERE o.Order_ID = od.Order_ID AND o.OrderID IN (SELECT Order_ID FROM Order_Details WHERE OD_Amount > 100) GROUP BY o.First_Name, o.Last_Name
    

    【讨论】:

      【解决方案5】:

      我相信这就是您正在寻找的。 EXISTS 子句将结果限制为仅具有单个订单项 > 100 的订单。GROUP BY 通过包含 Order_ID 列来说明在同一天下达的多个订单。

      SELECT
        o.First_Name
       ,o.Last_Name
       ,o.Order_Date
       ,SUM(od.OD_Amount) AS Total_Amount
      FROM Orders o
        INNER JOIN Order_Details od ON od.Order_ID = o.Order_ID
      WHERE EXISTS(SELECT *
                   FROM Order_Details od2
                   WHERE od2.OD_Amount > 100
                     AND od2.Order_ID = o.Order_ID)
      GROUP BY
        o.Order_ID
       ,o.First_Name
       ,o.Last_Name
       ,o.Order_Date
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-11
        • 2012-11-29
        • 1970-01-01
        • 1970-01-01
        • 2021-01-20
        • 2013-01-08
        • 2021-04-26
        相关资源
        最近更新 更多