SQL-是否可以对特定值之间的行求和?

SQL-是否可以对特定值之间的行求和?,sql,sql-server,tsql,Sql,Sql Server,Tsql,如果这是重复的话,我很抱歉,但是我找不到我特定问题的答案。我有一个表格,列出了销售订单上的产品及其各种数量。一些产品是其他产品的组件,并用标志表示。我想知道是否有一种方法可以使父项/正常项的运行总计在每个父项/正常项上重置 以下是表格数据和我所需输出的示例: OrderNo物料数量常规行 349443 AFU20451-KIT1 Y 1 349443 AFU20451 0 N 2 349443霍克-14252 1北3 349443 RGPM-25H4 1 N 4 349443 AV-003-26

如果这是重复的话,我很抱歉,但是我找不到我特定问题的答案。我有一个表格,列出了销售订单上的产品及其各种数量。一些产品是其他产品的组件,并用标志表示。我想知道是否有一种方法可以使父项/正常项的运行总计在每个父项/正常项上重置

以下是表格数据和我所需输出的示例:

OrderNo物料数量常规行
349443 AFU20451-KIT1 Y 1
349443 AFU20451 0 N 2
349443霍克-14252 1北3
349443 RGPM-25H4 1 N 4
349443 AV-003-265 1 Y 5
349443 AV-A00090-KIT 1 Y 6
349443 AV-A00091 1 N 7
349443 AV-A00090 1 N 8
349443 AV-00043 1 N 9
349443 AV457/310GR/FP 2 Y 10

期望输出:

OrderNo物料数量
349433 AFU20451-KIT1 3
349433 AV-003-265 1
349433 AV-A00090-KIT 4
349433 AV457/310GR/FP 2

如您所见,我希望在每次显示Y时重置总和,仅包括父项(我可以绕过此问题,因为我可以保持项目的顺序不变,可以使用行号)。为了做到这一点,我一直在尝试使用Over和partitionby,但没有效果。让我知道这是否可能,或者你是否需要任何进一步的信息

试试这个:

select orderno, item, sum(qty) over(partition by regular order by regular)
from your_table 
group by  orderno, item, regular

当前的表述违反了第一个Codd规则

规则1:信息规则:关系数据中的所有信息 base在逻辑级别显式表示,并且仅在一个 方式–按表中的值


但我相信您仍然可以创建函数/过程,并使用IF语句逐个迭代Y/N。例如,您可以创建新表,如果Y-向表中添加新行,如果N-向最新行的数量添加+1。

我将创建两个单独的表:制造商和零件,以获取值,这样您就不必手动阻塞每个库存,或者关心它们在发票列表中的位置

with cte as 
 ( 
   select OrderNo, 
      -- only return the main item
      case when Regular = 'Y' then Item end AS Item, 
      Qty,
      -- assign a unique number to each `YNNN..` component group
      -- needed for GROUP BY in next step
      sum(case when Regular = 'Y' then 1 else 0 end)
      over (partition by OrderNo
            order by Line
            rows unbounded preceding) as grp
   from myTable
 )
select OrderNo,
   -- find the matching value for the main component
   max(Item), 
   sum(Qty)
from cte
group by OrderNo, grp
[ []

然后,您需要做的就是将这些值与零件表进行比较,以获得这些数据。这需要更多的前期工作,但将这些数据全部保存和存储会有回报。未来的示例查询类似于:

SELECT OrderNo.OrderTable, Item.OrderTable, Sum(Qty.OrderTable) AS Quantity
FROM OrderTable INNER JOIN Part ON OrderTable.Item = Table.PartName
GROUP BY OrderNo.OrderTable, Item.OrderTable, Regular.OrderTable, Part.ParentID;

这是假设您的记录有某种顺序,但我无法通过查看您的数据来辨别我将如何对它们进行排序。您在语句中如何对其进行排序?提示:分区您将在这里发现的问题是数据库没有固有的顺序。如果没有id列或其他方法,您无法保证记录的顺序是urned每次都是相同的。您的示例中是否有ID字段或维护订单的内容?是的,很抱歉,我没有包括它,但有一列按项目的确切顺序列出了项目。组件产品始终位于父项的正下方。您是否也可以包括该列以确保如上图所示的项目顺序..在上面的数据屏幕中.按规则排序只需将它们放入一个n,n,n,n,y,y,y的列表中,而不保留他在这里的半任意顺序.也许按行排序而不是按规则排序会起到作用.问题在这个答案之后更新..是的,这个答案在他试图回答之前出现do是可能的。包含行使这个解决方案可行(至少在伪理论中是这样。不应该有from子句吗?)制造商表的用途是什么?您只需要零件表中的
ParentID
。当然,您可能有嵌套零件,即零件分解或BOM表,然后您需要递归…我只是假设如果您有一个零件表,您也会有多个要跟踪的制造商。我不想推荐一个Parts表以查找以单词形式列出的制造商,而不是引用表。但是您还获得了一个
订单号
,因此必须有一个
订单
表和供应商和客户以及…:-)您可能会想,但我不会仅从该表中假设。我无法判断订单是为客户生成的,还是为客户生成的从采购订单。制造商和供应商不一定是同一家公司。最初我认为这不起作用,但这只是因为我的数据发生了变化。这非常有效!非常感谢。