【问题标题】:Distinct Record Issue in MS SQL Server 2008 queryMS SQL Server 2008 查询中的不同记录问题
【发布时间】:2009-08-27 01:11:17
【问题描述】:

我有这个查询来获取值为 1 和 5 的总 OrderStatus。我如何只对不同的 OD.OrderStatus=2 求和,因为 Orderdetails 表中可以有多个记录,OrderStatus 为 2。

请帮忙

SELECT O.OrderDate,
Sum(Case When OD.OrderStatus = 2 Then 1 Else 0 End) AS OrdersOffered,
Sum(Case When OD.OrderStatus = 1 Then 1 Else 0 End) AS OrdersAccepted
FROM Orders O,OrderDetails OD
Where O.Order_ID=OD.Order_ID
GROUP BY OrderDate

【问题讨论】:

  • 请提供一些示例数据和您正在寻找的结果。到目前为止,您提供的描述似乎不完整或相互矛盾,我们无法弄清楚您真正想要做什么。

标签: sql sql-server-2008


【解决方案1】:

所以,无论你有多少,你都希望它为 1?也许使用 SIGN?

SELECT O.OrderDate
  ,SIGN(Sum(Case When OD.OrderStatus = 2 Then 1 Else 0 End)) AS OrdersOffered
  ,Sum(Case When OD.OrderStatus = 1 Then 1 Else 0 End) AS OrdersAccepted
FROM Orders O
  JOIN OrderDetails OD  ON O.Order_ID=OD.Order_ID
GROUP BY OrderDate

【讨论】:

  • 谢谢。我想我需要 SUM(Sign(Case When OD.OrderStatus = 2 Then 1 Else 0 End)) AS OrdersOffered 我需要明天试试。不知道行不行
  • 没有。假设您有 10 个 OrderStatus = 2 条记录。 SUM(SIGN( 将添加许多 1 得到 10。您想将 10 (Sum) 转换回 1。所以它是 SIGN(SUM(,而不是 SUM(SIGN(.
  • 谢谢罗伯。这是我的担忧。上面的查询我在 where 子句中有一个日期范围。它返回将显示 orderdate、ordersoffered、ordersaccepted 范围内的每个日期。但是 OrderID 10010 可能有 10 个状态为 2 的订单,但它应该只考虑 1 个但在同一日期 OrderIDs 10010、10011、10012、10013 的总和应该是 3 而不是 1。谢谢
  • 但是 Sign(Sum(Case When OD.OrderStatus = 2 Then 1 Else 0 End)) 总是会返回 1 对吧?
  • 您按 OrderDate 分组。因此,如果您希望每个 OrderDate 最多 1 个,那么 SIGN 会有所帮助。 SIGN 给出 1、0 或 -1。因此,如果昨天有三个 OrderStatus=2,今天没有,明天有一个,您将拥有:昨天,1.今天,0.明天,1
【解决方案2】:

只需使用子查询来帮助您获得结果。

SELECT 
O.OrderDate, 
Sum(Case When OD.OrderStatus = 2 Then 1 Else 0 End) AS OrdersOffered, 
Sum(Case When OD.OrderStatus = 1 Then 1 Else 0 End) AS OrdersAccepted 
FROM Orders O inner join
    (Select distinct Order_ID,OrderStatus 
    from OrderDetails) OD on O.Order_ID=OD.Order_ID
GROUP BY OrderDate 

应该做的伎俩...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多