Sql 仅聚合特定行项目

Sql 仅聚合特定行项目,sql,Sql,我尝试聚合“Units”和“Amount”字段以删除与Apple相反的行项目,但它也将其他行项目(我需要在单独的行中列出)分组为Pears。是否有任何方法可以删除在不使用聚合函数的情况下被反转的行项目 SELECT Account, Code, Item, SUM(Units) As ‘Total Units’, SUM(Amount) AS ‘TotalAmt’ FROM Fruit GROUP BY Account, Code, Item 桌子 结果 TABLE Account Co

我尝试聚合“Units”和“Amount”字段以删除与Apple相反的行项目,但它也将其他行项目(我需要在单独的行中列出)分组为Pears。是否有任何方法可以删除在不使用聚合函数的情况下被反转的行项目

SELECT Account, Code, Item, SUM(Units) As ‘Total Units’, SUM(Amount) AS ‘TotalAmt’
FROM Fruit
GROUP BY Account, Code, Item
桌子

结果

TABLE
Account    Code      Item   Units   Amount
-------  --------   ------- -----   ------
10325      7231      Pear   2   1.24
10431      5972      Apple  1   .50
请尝试以下代码:

SELECT Account, Code, Item, SUM(Units) As ‘Total Units’, SUM(Amount) AS ‘TotalAmt’
FROM Fruit
GROUP BY Account, Code, Item
having sum(Units)>0

假设我们有可用的窗口函数,我们可以创建一个按帐户、项目单位和金额划分的行号,在这些字段上联接,然后在行号上联接,这样我们就不会将退货分配给多个销售

回报可能与错误的销售挂钩,因此我不太喜欢这种反应;但是如果我们不在乎这一点,只是想消除销售记录。。。这应该可以做到

假设:只有收益为负单位和负金额

SELECT Sales.Account, Sales.Code, Sales.Item, Sales.Units, Sales.Amount 
FROM (SELECT Account, Code, Item, Units , Amount, Row_number() over (partition by Account, Code, Item, Units, Amount order by UniqSeq) RN
      FROM Fruit
      WHERE UNITS >= 0) Sales
LEFT JOIN (SELECT Account, Code, Item, Units , Amount, Row_number() over (partition by Account, Code, Item, Units, Amount order by UniqSeq) RN
           FROM Fruit
           WHERE UNITS < 0
             AND amount < 0) Returns
  on Sales.Account = Returns.Account
 and Sales.Code = Returns.Code
 and Sales.Item = Returns.Item
 and Sales.Units *-1 = Returns.Units
 and Sales.Amount *-1 = Returns.Amount
 and Sales.RN = Returns.RN
WHERE Returns.Account is null
和OrderID,或每行自动递增的ID

如果我假设oracle:

with  Fruit (uniqSeq, Account,    Code,      Item,   Units,   Amount) as 
(
select 1, 10325,      5972,  'Apple',  1,   .50 from dual union all
select 2, 10325,      5972,  'Apple',  -1,     -.50  from dual union all
select 3, 10325,      7231,  'Pear',   1,   .62  from dual union all
select 4, 10325,      7231,  'Pear',   1,   .62  from dual union all
select 5, 10431,      5972,   'Apple',  1,   .50  from dual )

SELECT Sales.Account, Sales.Code, Sales.Item, Sales.Units, Sales.Amount 
FROM (SELECT Account, Code, Item, Units , Amount, Row_number() over (partition by Account, Code, Item, Units, Amount order by UniqSeq) RN
      FROM Fruit
      WHERE UNITS >= 0) Sales
LEFT JOIN (SELECT Account, Code, Item, Units , Amount, Row_number() over (partition by Account, Code, Item, Units, Amount order by UniqSeq) RN
           FROM Fruit
           WHERE UNITS < 0
             AND amount < 0) Returns
  on Sales.Account = Returns.Account
 and Sales.Code = Returns.Code
 and Sales.Item = Returns.Item
 and Sales.Units *-1 = Returns.Units
 and Sales.Amount *-1 = Returns.Amount
 and Sales.RN = Returns.RN
WHERE Returns.Account is null
这是一个视图,其中包含连接和select,显示了返回派生表,消除了where子句。。。所以您可以了解为什么returns.account为null时进行过滤会起作用


结果是否理想?如果是这样的话,那么您正在聚合pear,我想您不希望这样……是否有订单号或任何东西可以使销售/退货行唯一?我考虑两个子问题,一个用于销售,一个用于退货,然后是一个左连接,其中退货为空;但我需要一些方法来确保我们不会消除太多或太少,即使是自动递增的ID字段也会起作用。你能描述一下整张表吗?或者这5列是它吗?结果不是我想看到的。我只想删除已反转的项目及其原始条目。有一个唯一的序列号。除了单位和金额之外,销售和冲销之间是否有联系?Saiy我有3个额外的销售额到10325账户,代码为5972,每1个单位50个苹果。我怎么知道要删除哪一个?或者只要删除1就没关系了?如果只有一个,那么我们需要首先以某种方式对两个记录进行分组/标记,然后使用该标记删除重复项。这是公司拥有RMA退货商品授权的原因之一,以便他们知道将退货绑定到哪个订单并正确应用信用证。这是哪个RDBMS系统?SQL Server?mySQL?我想知道窗口功能是否可用。可能会添加另一个苹果。这里有一个序列号列,它列出了每个行项目的唯一id号。我只是回到这里。Windows函数可用,但我不断收到错误消息“无法添加表”。知道它为什么不起作用吗?我试图粘贴到查询中,但它说它太长了。哪个RDBMS?我已经进行了更新,以展示它将如何与oracle协同工作。注意,我假设uniqseq存在,因为您已经指出存在这样一个列,但没有为它定义名称。但是,即使不是oracle,上述内容也应该适用于SQL server,而不是FRUIT CTE。我使用的是SQL server。为了确保我们在同一页上,将为每个行项目条目分配唯一的id。如果项目被冲销,冲销行项目将被分配一个新的唯一id号。上述操作仍然有效。您可以在cte中的每一条线路上测试它。正如我早些时候指出的,唯一的问题是我们不能将冲销与正确的销售联系起来,仅仅是使用相同的帐户、代码和项目的销售,可能是针对不同的客户?这不起作用。当我在没有聚合函数的情况下运行查询并比较单位和金额之和时,结果不一致。因为我在Having语句中添加了聚合,所以我需要在Group By中添加聚合。在您的示例数据中,您正在聚合,那么为什么不使用聚合?我不明白你的意思1.如果你再解释清楚就有意义了
with  Fruit (uniqSeq, Account,    Code,      Item,   Units,   Amount) as 
(
select 1, 10325,      5972,  'Apple',  1,   .50 from dual union all
select 2, 10325,      5972,  'Apple',  -1,     -.50  from dual union all
select 3, 10325,      7231,  'Pear',   1,   .62  from dual union all
select 4, 10325,      7231,  'Pear',   1,   .62  from dual union all
select 5, 10431,      5972,   'Apple',  1,   .50  from dual )

SELECT Sales.Account, Sales.Code, Sales.Item, Sales.Units, Sales.Amount 
FROM (SELECT Account, Code, Item, Units , Amount, Row_number() over (partition by Account, Code, Item, Units, Amount order by UniqSeq) RN
      FROM Fruit
      WHERE UNITS >= 0) Sales
LEFT JOIN (SELECT Account, Code, Item, Units , Amount, Row_number() over (partition by Account, Code, Item, Units, Amount order by UniqSeq) RN
           FROM Fruit
           WHERE UNITS < 0
             AND amount < 0) Returns
  on Sales.Account = Returns.Account
 and Sales.Code = Returns.Code
 and Sales.Item = Returns.Item
 and Sales.Units *-1 = Returns.Units
 and Sales.Amount *-1 = Returns.Amount
 and Sales.RN = Returns.RN
WHERE Returns.Account is null