【问题标题】:Add duplicate values in a table sql server在表 sql server 中添加重复值
【发布时间】:2014-09-03 23:14:13
【问题描述】:
Select 
    P.ProductName, WFS.Status, OI.Quantity, OI.Price 
from 
    OrderItem As OI
Inner Join 
    Order As O On OI.OrderID = O.ID AND OI.ItemType = 1
Inner Join 
    Product P On OI.ProductID = P.ID
Inner Join 
    WorfFlowStatus As WFS On O.StatusID = WFS.ID

此查询返回行:

ProductName   Status    Quantity     Price
-------------------------------------------
ABC           Shipped      10         100
ABC           Shipped      10         100
BCE           Pending       20        200

现在我想在一行中选择相同的产品,但应该添加数量和价格。例如

ABC        Shipped         20       200    
BCE        Pending         20       200

如果状态和产品名称相同,则添加数量和价格,如果产品不同,则不添加数量和价格。

【问题讨论】:

  • 您需要对数据进行分组。阅读GROUP BY 子句
  • 嗨实际上我也在分组完整的查询是这样的。从 OrderItem 中选择 P.ProductName,WFS.Status,OI.Quantity,OI.Price As OI Inner Join Order As O On OI.OrderID = O.ID AND OI.ItemType = 1 在 OI.ProductID 上内连接产品 P = P.ID 在 O.StatusID 上内连接 WorfFlowStatus 作为 WFS = WFS.ID 按 P.ProductName、WFS.Status、OI.Quantity、OI 分组.价格
  • 根据你的SQL语句你不是
  • 不,你可以看到我在 cmets 部分添加的那个
  • 你已经得到了答案,但我建议你阅读互联网上的聚合函数和 GROUP BY 子句

标签: sql sql-server select


【解决方案1】:
Select 
  P.ProductName,
  WFS.Status,
  sum(OI.Quantity),
  sum(OI.Price) 
from OrderItem As OI 
  Inner Join Order As O 
    On OI.OrderID = O.ID AND OI.ItemType = 1 
  Inner Join Product P 
    On OI.ProductID = P.ID 
  Inner Join WorfFlowStatus As WFS 
    On O.StatusID = WFS.ID
group by
  P.ProductName,
  WFS.Status

【讨论】:

  • 添加一点上下文、解释或 cmets 可能会使这个答案更有帮助。
【解决方案2】:

正如 cha 所指出的,Group By 子句是关键:

Select P.ProductName,WFS.Status,sum(OI.Quantity),sum(OI.Price)
from OrderItem As OI 
Inner Join [Order] As O On OI.OrderID = O.ID AND OI.ItemType = 1 
Inner Join Product P On OI.ProductID = P.ID 
Inner Join WorkFlowStatus As WFS On O.StatusID = WFS.ID
group by productName, Status

【讨论】:

  • 我已经尝试过这个查询,但它仍然显示重复的产品名称。我不知道到底出了什么问题。我在 OI 表中有唯一的项目 ID,其中包含工作流和产品的 fk,所以我有项目唯一 ID,但产品可以重复,所以我想要产品是否与数量和价格的总和相同,但项目 ID 是唯一的,为什么 groupby 不工作。如果我是正确的。
  • 因为我们是在 ProductName 和 Status 上进行分组,所以它应该只按唯一的名称和状态进行分组,无论是多个同名的产品还是多个不同 Status 的 WorkFlowStatus。当然,如果数据库中的值略有不同,比如末尾有空格,那么所有的赌注都没有了。您是否有一些产品名称中带有空格的可能性?
  • 是的,你可能是正确的,我会检查它,但我的问题是,如果一行中的一列具有唯一值并且其他列值在表中出现重复而不是 group by 仍然有效,我的意思是两个项目可以有相同的产品,但数量和价格不同。
  • Group by 只关心分组依据的列。如果您按 ProductName 分组,它将忽略 ProductID 和任何其他产品列。而且,由于 sum 之类的聚合运算符不会影响行数,因此您可以删除 Quantity 和 Price 的总和,您仍然会得到相同的行数。唯一要查看空格的列是 Status 和 ProductName
  • 是的,我已经重新创建了整个表结构,现在一切都很好。感谢您的帮助,再次感谢。
【解决方案3】:

'over with Partition by' 可以提供帮助。 例如

选择产品名称, 地位, 数量, (SUM(Quantity) OVER (PARTITION BY ProductName)) 作为 TotalQuantity FROM YourTableName 并加入

【讨论】:

    【解决方案4】:
    select P.ProductName, WFS.Status, sum(OI.Quantity), sum(OI.Price)
    from OrderItem OI, Order O, Product P, WorkFlowStatus WFS
    where OI.OrderID = O.ID and OI.ItemType = 1 and
          OI.ProductID = P.ID and
          O.StatusID = WFS.ID
    group by productName, Status
    

    【讨论】:

    • 要在表中添加重复值,您必须使用 group by 子句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 2013-01-21
    • 1970-01-01
    相关资源
    最近更新 更多